目录
1、System.gc()的理解
2、内存溢出与内存泄漏
3、Stop The World
4、垃圾回收的并行与并发
5、安全点和安全区域
6、引用
6.1、强引用
6.2、软引用
6.3、弱引用
6.4、虚引用
6.5、终结器引用
1、System.gc()的理解
显示触发GC,不能保证立即生效,一般情况下,GC是自动触发的,不需要手动触发
2、内存溢出与内存泄漏
1、内存溢出:没有空闲内存,GC之后依然内存不足,无法为新的对象分配内存 2、内存泄漏:使用资源时,分配一块内存,使用完后没有及时释放。对象已经不被使用了,但是GC又不能回收他们 ?? ? ? 举例:
? ? ? ? ①、单例对象的生命周期和应用程序一样长,如果持有对外部对象的引用,就可能产生内存泄漏 ? ? ? ? ②、数据库连接、网络连接、IO连接没有及时手动close
##内存溢出
##内存泄漏
?
3、Stop The World
①、stop the world ②、垃圾收集过程中,应用程序会暂停的现象 ③、可达性分析算法中枚举根节点会暂停所有线程
4、垃圾回收的并行与并发
并行:多条垃圾收集线程并行执行,工作线程暂停-ParNew,Parallel Scavenge,Parallel Old 串行:单个垃圾收集线程执行,工作线程暂停-Serial、Serial Old 并发:垃圾收集线程和工作线程交替执行-CMS、G1
##并发
?##并行
##并行 VS 并发
##垃圾收集器的并发与并行
5、安全点和安全区域
安全点:(什么时间、什么位置才会停下来GC) ?? ?①、程序并非在所有位置都能停顿下来GC,只有在特定位置才能停顿下来GC,这些位置称之为安全点(对象的引用关系不会发生改变) ?? ?②、安全点太少导致GC等待时间过长,安全点太多导致性能下降-通常会选择执行时间较长的指令作为安全点(方法调用,异常跳转、循环跳转) ?? ?③、如何确定在GC时,所有线程都在临近的安全点停顿下来? ?? ??? ?1、抢先式中断-先中断所有线程,如果线程没有到安全点,恢复线程,让线程跑到安全点 ?? ??? ?2、主动式中断-设置一个中断标志,各个线程都跑到安全点轮训这个标志,如果中断标志为真,则将自己中断挂起 安全区域: ?? ?①、线程的sleep/blocked状态(被挂起),无法走到安全点 -> 安全区域 ?? ?②、在一段代码段中,对象的引用关系不会发生改变,在这个区域的任何位置都可以进行GC
##安全点
?##安全区域
6、引用
1、强引用-不回收
2、软引用-内存不足即回收
3、弱引用-发现即回收
4、虚引用-对象回收跟踪
6.1、强引用
?
6.2、软引用
6.3、弱引用
6.4、虚引用
6.5、终结器引用
|