GC这块,当java才入门的时候,老师说java不像c++,c语言需要对内存进行管理,java有垃圾回收机制,会自动进行回收,是实际的生产中也没关注过这些,现在回过头好好了解下,发现里面很有回收很多的机制。
####GC
GC(Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。
不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:
###垃圾收集算法
* 标记-清除算法
标记阶段
标记存活对象
清除阶段
统一回收所有未标记的对象
缺点
会产生内存碎片,如果空间内存碎片太多,当程序产生大对象无法在堆中找到连续空间大小存放的时候,会强制发生GC
* 复制算法
原理
内存一分为二,每次只使用其中一块,当一块内存没有连续空间存储对象的时候,会把存活下来的对象复制到另外一块内存中,然后一次性清除之前的哪块空间
优缺点
标记-整理算法
>原理
优缺点
分代思想
1. 堆划分为新生代和老年代
2. 新生代中,能够存活的对象很少,可以使用复制算法
3. 老年代中,对象存活率高,而且没有额外的空间用来做老年代的担保,可以使用标记清除或者标记整理算法
###垃圾收集器-GC
1. Serial 新生代串行收集器 新(复制算法),老(标记整理)
2. ParNew 新生代并行收集器
3. Parallel Scavenge 新生代并行收集器
4. 目标:尽可能缩GC时用户线程的停顿时间
5. 在注重吞吐量或CPU资源敏感的场合,可以优先考虑Parallel
6. Scavenge收集器 + Parallel Old收集器
7. Serial Old 老年代串行收集器
8. Parallel Old 老年代并行收集器
9. CMS 真正意义上的并发收集器(老年代收集器)
10. 目标:最短的GC停顿时间
11. G1
-verbose:gc
打印GC日志信息
-XX:+PrintGCDetails
打印GC日志信息
-Xloggc:d:/gc.log
GC日志目录
-XX:+PrintHeapAtGC
每次一次GC后,都打印堆信息
-XX:+TraceClassLoading
类加载信息
-XX:+PrintClassHistogram
配置了该参数后,在程序执行过程中,按下Ctrl+Break后,就可以打印类的信息
PS:其实说这么多啊,最重要的还是使用打印的方式看看那个发生内存溢出的情况与数据操作有很大的关系,有助于优化程序。
>>原创文章,欢迎转载。转载请注明:转载自,谢谢!>>原文链接地址:上一篇:已是最新文章