60.System.gc()的理解、内存溢出与内存泄漏、Stop the World

1.System.gc()的理解

  1. 显示调用System.gc()会建议垃圾回收器进行Full GC
  2. 注意只是建议,并不一定会真的进行Full GC
    60.System.gc()的理解、内存溢出与内存泄漏、Stop the World

2.内存溢出

  1. 内存溢出要么是程序有问题导致的,要么就是分配的内存不够导致的。
    60.System.gc()的理解、内存溢出与内存泄漏、Stop the World
  2. 内存溢出出现的两个原因:
    a) 堆内存设置不够
    b) 代码中创建了大量大对象,并且长时间不能被垃圾收集器回收(存在引用)
    60.System.gc()的理解、内存溢出与内存泄漏、Stop the World
  3. 在抛出OOM之前,一般都会进行一次垃圾回收,尽可能的去清理出空间。当然也不是在任何情况下垃圾回收都会被触发。例如分配的对象的大小超过了堆的最大空间,就会直接抛出OOM
    60.System.gc()的理解、内存溢出与内存泄漏、Stop the World

3.内存泄漏

  1. 只有对象不会再被程序使用,但是GC又不能回收它们的情况,就叫内存泄漏。
  2. 内存泄漏可能会导致内存溢出。当内存泄漏越来越多,逐步蚕食整个内存,直至耗尽所有内存,就会导致OOM
    60.System.gc()的理解、内存溢出与内存泄漏、Stop the World
    内存泄漏例子:
    a) 单例模式的返回的对象,引用了另一个对象,被引用的对象存在内存泄漏。
    b) 数据库连接、IO连接的对象没有手动close,不能被回收,会存在内存泄漏。
    60.System.gc()的理解、内存溢出与内存泄漏、Stop the World

4.Stop the World

  1. STW指的是GC事件发生过程中,会停止用户的所有线程,整个应用程序就像卡死一样,没有任何响应。
  2. STW是为了确保对象可达性分析的准确性。如果对象在可达性分析过程中引用关系还在变化,则会导致分析的结果不准确。
    60.System.gc()的理解、内存溢出与内存泄漏、Stop the World
  3. STW与采用哪款GC器无关,所有的GC器都有这个事件。
    60.System.gc()的理解、内存溢出与内存泄漏、Stop the World
    更多JVM文章请访问我的JVM专栏:
    https://blog.****.net/u011069294/category_10113093.html