JVM基础知识笔记
1. 垃圾回收相关算法
标记清除-标记整理-复制 这三个看上面的文章
1.1 分代收集算法
将不同生命周期的对象采用不同的收集方式,以便提高回收效率
,一般是将Java堆分为新生代和老年代,这样可以根据各个年代的特点使用不同的回收算法,提高垃圾回收效率
1.1.1 增量收集算法
标记清除-标记整理-复制 这三种算法在垃圾回收过程中,用户线程将处于 STW 状态,如果垃圾回收时间过长将严重影响用户体验
增量收集算法基本思想
垃圾收集线程只收集一小片区域的内存空间,接着切换到用户线程执行,依次反复,直到垃圾收集完成
。
总的来说,增量收集算法的基础仍是传统的标记清除,复制算法,增量收集算法通过对线程间冲突的妥善处理,允许垃圾收集线程以分阶段的方式完成标记、清理或复制工作
1.1.2 分区算法
堆空间越大,一次GC时间就越长,为了更好的控制GC产生的停顿时间,将一块打的内存区域分割成多个小块,根据目标的停顿时间,每次合理地回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿
分区算法将按照对象的生命周期长短划分成两个部分,分区算法将整个堆空间划分成连续的不同小区间,每一个区间独立使用,独立回收。这种算法的好处是可以空间一次回收多个小区间
2 垃圾回收相关概述
2.1 System.gc()的理解
- 通过
System.gc() 或 Runtime.getRuntime().gc()
的调用,会显示触发Full GC,同时对老年代和新生代进行回收 - 然而 System.gc() 调用附带一个免责声明,无法保证对垃圾收集器的调用
2.2 内存溢出与内存泄漏
- 内存溢出: OUtOfMemoryError,没有空闲内存,并且垃圾收集器也无法提供更多内存
- Java虚拟机的堆内存设置不够
- 代码中大量创建了大对象,并且长时间不能被垃圾收集器收集(存在被引用)
内存泄漏
:只有对象不被程序用到了,但GC又不能回收他们的情况,才叫内存泄漏
一旦发生内存泄漏,直到耗尽所有的内存,最终出现OOM异常,导致程序崩溃,