60.System.gc()的理解、内存溢出与内存泄漏、Stop the World
1.System.gc()
的理解
- 显示调用
System.gc()
会建议垃圾回收器进行Full GC
- 注意只是建议,并不一定会真的进行
Full GC
2.内存溢出
- 内存溢出要么是程序有问题导致的,要么就是分配的内存不够导致的。
- 内存溢出出现的两个原因:
a)
堆内存设置不够b)
代码中创建了大量大对象,并且长时间不能被垃圾收集器回收(存在引用) - 在抛出
OOM
之前,一般都会进行一次垃圾回收,尽可能的去清理出空间。当然也不是在任何情况下垃圾回收都会被触发。例如分配的对象的大小超过了堆的最大空间,就会直接抛出OOM
。
3.内存泄漏
- 只有对象不会再被程序使用,但是
GC
又不能回收它们的情况,就叫内存泄漏。 - 内存泄漏可能会导致内存溢出。当内存泄漏越来越多,逐步蚕食整个内存,直至耗尽所有内存,就会导致
OOM
。
内存泄漏例子:a)
单例模式的返回的对象,引用了另一个对象,被引用的对象存在内存泄漏。b)
数据库连接、IO
连接的对象没有手动close
,不能被回收,会存在内存泄漏。
4.Stop the World
STW
指的是GC
事件发生过程中,会停止用户的所有线程,整个应用程序就像卡死一样,没有任何响应。STW
是为了确保对象可达性分析的准确性。如果对象在可达性分析过程中引用关系还在变化,则会导致分析的结果不准确。STW
与采用哪款GC
器无关,所有的GC
器都有这个事件。