一般我们不必关心Java的垃圾回收问题,JVM会帮我们处理;但是如果对JVM的GC机制不了解,可能会写出很影响性能的代码 在此之前,我们需要了解到JVM垃圾的回收的时候,有可能出现的一种情况:stop-the-world,即JVM判定有大量垃圾需要回收,除了GC线程外,其他线程均处于阻塞状态,知道GC任务完成。所以针对GC的优化工作就是主要是减少stop-the-world触发次数(...
一般我们不必关心Java的垃圾回收问题,JVM会帮我们处理;但是如果对JVM的GC机制不了解,可能会写出很影响性能的代码
在此之前,我们需要了解到JVM垃圾的回收的时候,有可能出现的一种情况:stop-the-world,即JVM判定有大量垃圾需要回收,除了GC线程外,其他线程均处于阻塞状态,知道GC任务完成。所以针对GC的优化工作就是主要是减少stop-the-world触发次数(一般来说就是Full GC)。
JVM的垃圾回收,针对的是堆内存空间和方法区,而栈内存空间的数据会在超出作用域后JVM自动清理,不归GC管理。
通常来说,堆内存空间被大致分为
年轻代:对象被创建后被放入老年代,大部分对象会在这个区域保存直到销毁,但是GC多次运行后依然存在的对象会根据存活时间,依次移到老年代
老年代: 所占用的空间要比年轻代大得多
在年轻代的清理称为MinorGC,年老代称为Full GC
GC对于年轻代 老年代 区域的扫描频率是不一样的,相对来说老年代扫描频率低很多
一般来说GC通过一下的条件判断是否回收
1.对象没有引用
2.作用域发生未捕获的异常
3.程序在作用域内正常执行完毕
4.程序意外停止(如 kill -9 线程)
5.执行System.exit()
当然我们把杜对象显式的=null 后也是可以的
注意以上情况只是被标记为可回收,但具体什么时间回收有JVM判断
通常的优化做法是设置年轻代转年老代的转换比例/年龄阈值
=============================================
漏掉了持久区(方法区)的GC回收介绍
必须满足以下三个条件
1.所有实例都被回收
2.加载该类的类加载器被回收
3.Class对象无法通过任何对象被访问
本站为非盈利网站,如果您喜欢这篇文章,欢迎支持我们继续运营!
本站主要用于日常笔记的记录和生活日志。本站不保证所有内容信息可靠!(大多数文章属于搬运!)如有版权问题,请联系我立即删除:“abcdsjx@126.com”。
QQ: 1164453243
邮箱: abcdsjx@126.com