博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle HotSpot虚拟机的JVM栈和方法区实现
阅读量:7048 次
发布时间:2019-06-28

本文共 802 字,大约阅读时间需要 2 分钟。

  hot3.png

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。

其中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倍以上。

转载于:https://my.oschina.net/foodon/blog/354640

你可能感兴趣的文章
思想:CoreMVC为什么只有一个文件(5)
查看>>
OsiriX Graphic User Interface
查看>>
spark ml的回归分析
查看>>
对webservice的一些简单理解
查看>>
深入理解spring注解@PropertySource的实现原理
查看>>
关于滨野纯的访谈
查看>>
前线解释多线程《一》
查看>>
WordPress禁止全英文的垃圾评论内容的方案
查看>>
mydumper安装和使用
查看>>
微信小程序开发之分包
查看>>
使用 Exception 写出优雅的代码
查看>>
我的友情链接
查看>>
在js中如何获取地址栏上的参数呢
查看>>
ELK日志分析单机系统详解
查看>>
MonkenRunner通过HierarchyViewer定位控件的方法和建议(Appium/UIAutomator/Robotium姊妹篇)...
查看>>
[开源] 轻量级移动设备即时通讯技术MobileIMSDK:Android客户端开发指南
查看>>
js函数返回多个返回值的示例代码
查看>>
eclipse.ini内存设置
查看>>
ceph上weight和reweight的区别
查看>>
【路由器API】通过程序控制路由器的各种操作
查看>>