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器都有这个事件。

浙公网安备 33010602011771号