JVM内存管理(二)

JVM内存管理

  JVM在执行java程序的过程中,会把内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。

程序计数器

  程序计数器:当前线程所执行字节码的行号指示器。

  由于JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器只会执行一条线程中的指令。为了线程切换后能够恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各线程之间计数器互不影响,独立存储。

  程序计数器:线程私有的内存。

Java虚拟机栈

  每个方法在执行的同时,都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

  每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

  局部变量所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

  Java虚拟机栈,与程序计数器一样,是线程私有的,生命周期同线程相同。

本地方法栈

  本地方法栈类似于虚拟机栈,区别在于:虚拟机栈为虚拟机执行java方法服务。

  本地方法栈则为虚拟机执行Native方法服务。

Java堆

  Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。

  Java堆的唯一目的,就是存放对象实例,几乎所有的对象实例都在这里分配内存。

  即:所有的对象实例及数组,都要在堆中分配内存。

 

  Java堆分为新生代、旧生代。

  新生代又分为:Eden区、From Survivor区、To Survivor区。目前,收集器基本都采用分代收集算法,进一步划分内存空间的目的,是为了更好地回收内存或者更快的分配内存。

方法区

  方法区用于存储类信息、常量、静态变量、及时编译器编译后的代码等数据。

垃圾收集器

  程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭。

  栈中的栈帧随着方法的进入和退出而有条不紊地执行着入栈和出栈的操作。每个栈帧中分配多少内存基本上在类结构确定下来时就已知。

  这几个区域的内存分配和回收都具备确定性,在这几个区域内,就不需要过多考虑回收的问题。因为方法结束或线程结束时,内存自然就跟着回收了。

内存分配

  对象的内存分配,往大方向讲,就是堆上分配。

  对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下,也可能会直接分配在老年代。

  新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为java对象大多数都具备朝生夕灭的特征。

              所以,Minor GC非常频繁,一般回收速度也比较快。

  老年代GC(Major GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC。

              Major GC的速度一般会比Minor GC速度慢10倍以上。

分代收集算法:

  在新生代中,每次垃圾收集时,都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本,就可以完成收集。

  年老代中,因为对象存活率高,没有额外空间对它进行分配担保,就必须使用“标记-清理”,“标记-整理”算法来进行回收。

时间: 2024-10-23 06:43:36

JVM内存管理(二)的相关文章

Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确实很低,一方面,Java语言采用面向对象思想,这也决定了其必然是开发效率高,执行效率低.另一方面,Java语言对程序员做了一个美好的承诺:程序员无需去管理内存,因为JVM有垃圾回收(GC),会去自动进行垃圾回收. 其实不然: 1.垃圾回收并不会按照程序员的要求,随时进行GC. 2.垃圾回收并不会及时

JVM内存管理及垃圾回收

一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Program Counter Register).JVM虚拟机栈(JVM Stacks).本地方法栈(Native Method Stacks).堆(Heap).方法区(Method Area) 如下图: 1.程序计数器(Program Counter Register) 这 是一块比较小的内存,不在Ram上

java jvm内存管理/gc策略/参数设置

1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项技术当做Java语言的伴生产物.事实上GC的历史远远比Java来得久远,在1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.当Lisp还在胚胎时期,

JVM内存管理及GC机制

一.概述 JavaGC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.经过这么长时间的发展,javaGC机制已经日臻完善,几乎可以自动的为我们做绝大多数的事情. 虽然java不需要开发人员显示的分配和回收内存,这对开发人员确实降低了不少编程难度,但也可能带来一些副作用: 1. 有可能不知不觉浪费了很多内存 2. JVM花费过

Java内存模型和JVM内存管理

Java内存模型和JVM内存管理   一.Java内存模型: 1.主内存和工作内存(即是本地内存): Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量与Java编程里面的变量有所不同步,它包含了实例字段.静态字段和构成数组对象的元素,但不包含局部变量和方法参数,因为后者是线程私有的,不会共享,当然不存在数据竞争问题(如果局部变量是一个reference引用类型,它引用的对象在Java堆中可被各个线程共享,但是ref

详解JVM内存管理与垃圾回收机制 (上)

Java应用程序是运行在JVM上的,得益于JVM的内存管理和垃圾收集机制,开发人员的效率得到了显著提升,也不容易出现内存溢出和泄漏问题.但正是因为开发人员把内存的控制权交给了JVM,一旦出现内存方面的问题,如果不了解JVM的工作原理,将很难排查错误.本文将从理论角度介绍虚拟机的内存管理和垃圾回收机制,算是入门级的文章,希望对大家的日常开发有所助益. 一.内存管理 也许大家都有过这样的经历,在启动时通过-Xmx或者-XX:MaxPermSize这样的参数来显式的设置应用的堆(Heap)和永久代(P

你应该这样理解JVM内存管理

在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这两句话中,捕获到了 两个点 . java的自动内存管理机制,极大的节省了开发人员的精力,避免了易错且复杂的内存管理设计,相对于手动的内存管理这是极大的飞跃.java自动内存管理机制,其不能根据具体的场景提供最优的内存管理,其只提供普适的内存管理机制.想比于C++的手动内存管理,灵活性不够,存在制约系

JVM内存管理和垃圾回收机制介绍

http://backend.blog.163.com/blog/static/20229412620128233285220/ 内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实现的掌握是Java开发人员开发出高质量的Java系统的必备条件.最近整理了一些关于JVM内存管理和垃圾回收方面的知识,这里梳理一下,分享给大家,希望能够对Java虚拟机有更深入的了解. 1. JVM内存管理 首先,JVM将内存组织为主内存和工作内存两个部分.主内存中主要包括本地方法区和堆.每个线程都有一个工

JVM内存管理的机制

1.JVM内存管理的机制 内存空间划分为:Sun JDK在实现时遵照JVM规范,将内存空间划分为堆.JVM方法栈.方法区.本地方法栈.PC寄存器. 堆: 堆用于存储对象实例及数组值,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中对象所占用的内存由GC进行回收,在32位操作系统上最大为2GB,在64位操作系统上则没有限制,其大小可通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1GB:-Xmx为JVM可申请的最大He