首页 > 代码库 > Oracle HotSpot虚拟机的JVM栈和方法区实现
Oracle HotSpot虚拟机的JVM栈和方法区实现
Java Heap和Method Area是JVM中内存占用最大的区域,也是监控和调优的重点。
下图使用jvisualvm工具截取,Perm是永久代(Permanent Generation)、Old是年老代(Old Generation)、Eden Space 和S0+S1是年轻代(Young Generation,日志等处称之为New的也指这里), S0(也称From)和S1(也称To)合称Survivor Space。
下图使用jvisualvm工具截取,Perm是永久代(Permanent Generation)、Old是年老代(Old Generation)、Eden Space 和S0+S1是年轻代(Young Generation,日志等处称之为New的也指这里), S0(也称From)和S1(也称To)合称Survivor Space。
其中Permanent Generation对应Java虚拟机规范中的Method Area,Old Generation和Young Generation对应JVM Heap。
对象主要在年轻代的Eden区分配(不讨论JIT编译),其实堆也不完全是线程共享,如果启用了本地线程分配缓冲,优先在线程的TLAB上分配,这个TLAB每个线程自己独占。少数情况下,也可能会直接分配在年老代。总体上遵守几个规则:
1、对象优先在Eden区分配,Eden区空间不足时发起Minor GC,将Eden区和正在使用的一个Survivor区对象转移到另一个Survivor区,如目标Survivor区空间不足,转移到年老代。
2、需要大量连续内存空间的Java大对象,如果超过设定的阈值,将直接在年老代分配。
3、对象每被移动到Survivor区一次年龄加1,超过设定的阈值仍然存活,将被移动到年老代。
4、Minor GC前,虚拟机会判断年老代是否有连续空间容纳新生代要转移的对象,如果没有,根据参数设置可能引发年老代Major GC。
Minor GC,指新生代GC,发生频率高速度快。
Major GC,也称Full GC,指年老代GC,发生频率低速度慢,一般比Minor GC慢10倍以上。
Oracle HotSpot虚拟机的JVM栈和方法区实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。