Java的垃圾回收器和内存溢出错误

堆区是什么意思?

在程序运行时,JVM会为了生成的对象分配一块被称为堆区的内存空间。

垃圾收集员是

垃圾收集器(GC)会自动管理应用程序的动态内存分配请求。在Java HotSpot的垃圾收集器中,使用了各种技术来提高这些操作的效率。

    • 世代別のスカベンジをエージングとともに使用して、再利用可能で大きなメモリー領域が含まれている可能性のあるヒープ内の領域に集中します。

 

    • 複数のスレッドを使用して、並列操作をアグレッシブに実行するか、アプリケーションと同時にバックグラウンドで長時間かかる操作を実行します。

 

    ライブ・オブジェクトを圧縮することで、連続的な大きな空きメモリーのリカバリを試行します。

内存溢出错误

由于内存不足,Java虚拟机无法分配对象,当垃圾收集器无法再分配可用内存时,将引发OutOfMemoryError。这可能导致虚拟机构建OutOfMemoryError对象,仿佛禁用了抑制或无法写入堆栈跟踪,或者是两者同时发生。

确认实施

样本代码

public class OOMTest {

  public static void main(String[] args) {
    int i=0;
    List<String> list = new ArrayList<>();
    String str = "OOM and GC";
    while(true) {
      list.add(str);
      str = str + str;
      i = i++;
    }
  }
}

运行选项

-Xms5m -Xmx5m -XX:+PrintGCDetails

执行结果

[GC (Allocation Failure) [PSYoungGen: 1024K->505K(1536K)] 1024K->741K(5632K), 0.0028444 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1376K->500K(1536K)] 1612K->1139K(5632K), 0.0006508 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1320K->500K(1536K)] 1960K->1619K(5632K), 0.0007013 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1160K->500K(1536K)] 4200K->3876K(5632K), 0.0005479 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 500K->484K(1536K)] 3876K->3860K(5632K), 0.0003762 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 484K->0K(1536K)] [ParOldGen: 3375K->2714K(4096K)] 3860K->2714K(5632K), [Metaspace: 2683K->2683K(1056768K)], 0.0048137 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [PSYoungGen: 20K->32K(1536K)] 4014K->4026K(5632K), 0.0003080 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 32K->0K(1536K)] [ParOldGen: 3994K->3354K(4096K)] 4026K->3354K(5632K), [Metaspace: 2683K->2683K(1056768K)], 0.0016179 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] 3354K->3354K(5632K), 0.0002432 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] [ParOldGen: 3354K->3342K(4096K)] 3354K->3342K(5632K), [Metaspace: 2683K->2683K(1056768K)], 0.0046264 secs] [Times: user=0.08 sys=0.00, real=0.00 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOfRange(Arrays.java:3664)
	at java.lang.String.<init>(String.java:207)
	at java.lang.StringBuilder.toString(StringBuilder.java:413)
Heap
 PSYoungGen      total 1536K, used 41K [0x00000000ffe00000, 0x0000000100000000, 0x0000000100000000)
  eden space 1024K, 4% used [0x00000000ffe00000,0x00000000ffe0a470,0x00000000fff00000)
  from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
  to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
 ParOldGen       total 4096K, used 3342K [0x00000000ffa00000, 0x00000000ffe00000, 0x00000000ffe00000)
  object space 4096K, 81% used [0x00000000ffa00000,0x00000000ffd43840,0x00000000ffe00000)
 Metaspace       used 2717K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 287K, capacity 386K, committed 512K, reserved 1048576K

在使用年龄伴随着PSYoungGen、ParOldGen和Metaspace的不同代际回收进行垃圾回收的过程中发生了结果。
在发生OutOfMemoryError之前,先执行了Full GC。

广告
将在 10 秒后关闭
bannerAds