JVM内存管理
来源:互联网 发布:java变量重新赋值 编辑:程序博客网 时间:2024/05/16 10:52
这些日子一直在研究jvm内存管理的东西,网上的知识很多,总结一下,以备后用。
首先,刚学java的时候就知道java类文件是以 .java为后缀的文件,经过javac命令编译后,编译成class文件,class文件中都是二进制格式的数据,所以想要看编译后的内容是什么,可以采用jdk自带的javap命令查看。
JVM的内存分栈内存、堆内存、本地方法栈和方法区四部分。java通过类加载器来加载class文件,加载到内存后,会把类、方法、常变量放到堆内存中。因为java是自动进行垃圾回收的,所以放入堆内存中的东西,哪些该回收,哪些不该回收?这都需要jvm去额外的线程去进行判断。但如果对于一个大型的J2EE系统来说,当创建的对象及方法变量比较多时,即堆内存中的对象比较多,如果一个一个对象去进行循环判断是否该回收时,这样的回收机制未免太耗时了,系统的性能一定会下降,jvm为了提高jvm执行效率,采用了堆内存分区管理的机制。
JVM把堆内存分三大块:Young Generation Space 新生区(也称新生代)、Tenure generation space养老区(也称旧生代)、Permanent Space 永久存储区。分区是为了进行模块化管理,管理不同的对象及变量以提高JVM的执行效率。
对于Young Generation Space ,它主要用来存储新创建的对象,内存大小会比较小,垃圾回收会比较频繁。对此区又分三个区域:一个Eden Space和两个Survivor Space。有一个前辈对这三个区域描述的相当透彻:
- 当对象在堆创建时,将进入年轻代的Eden Space。
- 垃圾回收器进行垃圾回收时,扫描Eden Space和A Suvivor Space,如果对象仍然存活,则复制到B Suvivor Space,如果B Suvivor Space已经满,则复制 Old Gen
- 扫描A Suvivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个Old对象,则将其移到Old Gen。
- 扫描完毕后,JVM将Eden Space和A Suvivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和BSuvivor Space。
内存管理表:
1、分代GC策略
组成
详解
堆(Heap)内存
JVM采用一种分代回收(generational collection)的策略,用较高的频率对年轻的对象(young generation)进行扫描和回收,这种叫做minor collection,而对老对象(old generation)的检查回收频率要低很多,称为major collection。这样就不需要每次GC都将内存中所有对象都检查一遍,以便让出更多的系统资源供应用系统使用。
非堆内存
GC不会在主程序运行期对PermGen Space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen Space错误。
2、 内存分配(申请)过程
步骤
操作
1
JVM会试图为相关Java对象在Eden中初始化一块内存区域;
2
当Eden空间足够时,内存申请结束。否则到下一步;
3
JVM试图释放对Eden中所有不活跃的对象minor collection,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
4
Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
5
当OLD区空间不够时,JVM会在OLD区进行major collection;
6
完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误"
3、对象衰老过程
步骤
操作
1
young generation的内存,由一块Eden和两块Survivor Space构成。新创建对象的内存都分配自eden。两块Survivor Space总有会一块是空闲的,用作copying collection的目标空间。Minor collection的过程就是将eden和在用survivor space中的活对象copy到空闲survivor space中。对象在young generation里经历了一定次数的minor collection后,年纪大了,就会被移到old generation中,称为tenuring。
2
剩余内存空间不足会触发GC,如eden空间不够了就要进行minor collection,old generation空间不够要进行major collection,permanent generation空间不足会引发Full GC。
GC触发条件GC类型触发条件触发时发生了什么注意查看方式YGCeden空间不足
清空Eden+from survivor中所有no ref的对象占用的内存
将eden+from sur中所有存活的对象copy到to sur中
一些对象将晋升到old中:
to sur放不下的
存活次数超过turning threshold中的
重新计算tenuring threshold(serial parallel GC会触发此项)
重新调整Eden 和from的大小(parallel GC会触发此项)
全过程暂停应用是否为多线程处理由具体的GC决定jstat –gcutil
gc logFGC
old空间不足
perm空间不足
显示调用System.GC, RMI等的定时触发
YGC时的悲观策略
dump live的内存信息时(jmap –dump:live)
permgen中已经被卸载的classloader中加载的class信息
如配置了CollectGenOFirst,则先触发YGC(针对serial GC)
如配置了ScavengeBeforeFullGC,则先触发YGC(针对serial GC)
全过程暂停应用
是否为多线程处理由具体的GC决定
是否压缩需要看配置的具体GCjstat –gcutil
gc log permanent generation空间不足会引发Full GC,仍然不够会引发PermGen Space错误。
- JVM内存管理总结
- JVM内存管理
- JVM内存管理总结
- JVM内存管理
- JVM内存管理
- JVM内存管理
- JVM&内存管理
- jvm内存管理
- JVM内存管理
- JVM内存的管理
- JVM内存管理
- JVM内存管理
- 【转载】JVM内存管理
- JVM内存管理
- JVM内存区域管理
- JVM内存管理
- JVM内存管理
- jvm 内存管理
- 基于半色调技术的图像打印程序(Image Printing Program Based on Halftoning)
- 关于寄存器操作的指针问题
- LeetCode | #21 Merge Two Sorted Lists
- 年终大学习之MySQL数据库优化学习笔记(三)
- ubuntu 在线安装jdk
- JVM内存管理
- Project-Euler problem 60 Prime pair sets
- Nodejs入门聊天室
- 树莓派使用Nokia5110显示屏
- CSS3+Html5 学习笔记之css 样式加载顺序
- 网上交易的守护者-数字签名
- hdu1166 敌兵布阵(线段树点更新模板题)
- File类的使用
- maven使用tomcat插件改变应用端口