jvm 内存

来源:互联网 发布:家谱制作软件 编辑:程序博客网 时间:2024/05/23 13:46

jvm 内存分为:堆,方法区(永久代 java8移除了),本地方法栈,虚拟机栈,程序计数器。

其中堆和方法区是线程共享的,本地方法栈和程序计数器,虚拟机栈是线程私有的。

虚拟机栈就是我们常说的栈:里面放的是局部变量表,操作数栈,方法返回地址,指向运行时常量池的引用。

本地方法栈是我们执行本地方法用的(native method)

程序计数器是当前需要执行的指令所在存储单元的地址,然后根据地址获得指令,得到指令后,程序计数器就自动加1;

线程共享区域:堆

堆里面大致分为俩个区域(暂时理解为俩个区域):新生代区和老年代区

新生代中分为三个区域:一个Eden(伊甸园),两个Survivor(幸存者区)。一个对象在新建的时候,是放在Eden区,之后随着对象的增加,Eden 区的地方不够了,这时候GC介入,检查Eden 区的对象是否还有对象引用,有的话把对象放到其中一个幸存者区(Survivor),之后清空Eden,之后接着放对象,再次放满了之后,检查现在存放着对象的那个Survivor 和Eden 区,把存在对象引用的对象复制到另一个空闲的Survivor中,如果另一个村放不开,就放到老年代中去,并且每经过一次GC 未被回收的对象的年龄都加一,有一个可以自己设置的临界值,默认是15.也就是说如果经过15次垃圾回收,还存活的对象会被放到老年代。新生代一般采用复制算法。

老年代:存放一些活得比较长的对象,一般采用标记-整理算法(不同虚拟机有不同实现)标记-整理算法比标记-清除算法多了个整理功能,因为标记算法会产生内存碎片。

1 0