java - 由于持续的 GC,强制 JVM 崩溃

标签 java garbage-collection jvm

我正在测试 Java 应用程序在压力下的处理方式。我想要测试的场景之一是 JVM 由于持续的垃圾收集而发生抖动。我见过的情况之一是,缓慢的内存泄漏将导致 JVM 进入一种状态,即它将持续花费超过 95% 的处理器时间来执行 GC。在此状态下,JVM 不执行应用程序代码。我有兴趣编写一个 Java 方法,该方法在执行时会引发这种 GC 行为。我该怎么做?

最佳答案

创建大量对象,直到发生OutOfMemoryError,然后释放其中一些。现在进入分配和释放循环。

示例

final int BLOCK_SIZE = 1000000;
List<byte[]> list = new LinkedList<>();
try {
    for (;;) {
        list.add(new byte[BLOCK_SIZE]);
        if (list.size() % 1000 == 0)
            System.out.println(list.size());
    }
} catch (@SuppressWarnings("unused") OutOfMemoryError e) {
    // Ignore
}
list.remove(0); // free some memory
System.out.println((list.size() + 1) + " Memory full");
for (int i = 0; i < 15; i++) {
    System.out.println(i);
    list.add(new byte[BLOCK_SIZE]);
    list.remove(0);
}
System.out.println("Done");

输出(使用-XX:+PrintGC -XX:+PrintGCTimeStamps运行)

0.089: [GC (Allocation Failure)  131241K->128483K(502784K), 0.0231605 secs]
0.123: [GC (Allocation Failure)  259971K->259265K(634368K), 0.0280219 secs]
0.151: [Full GC (Ergonomics)  259265K->259088K(858112K), 0.0481911 secs]
0.233: [GC (Allocation Failure)  522083K->522044K(858112K), 0.0533938 secs]
0.286: [Full GC (Ergonomics)  522044K->521794K(1285632K), 0.0087057 secs]
0.315: [GC (Allocation Failure)  784782K->784749K(1454592K), 0.0514033 secs]
0.366: [Full GC (Ergonomics)  784749K->784500K(1792512K), 0.0095001 secs]
1000
0.425: [GC (Allocation Failure)  1215843K->1215427K(1792512K), 0.0880220 secs]
0.513: [Full GC (Ergonomics)  1215427K->1215181K(2387968K), 0.0134368 secs]
0.558: [GC (Allocation Failure)  1646521K->1646108K(2724352K), 0.0873853 secs]
0.646: [Full GC (Ergonomics)  1646108K->1645863K(3247616K), 0.0134679 secs]
2000
0.754: [GC (Allocation Failure)  2413882K->2413709K(3247616K), 0.1432810 secs]
0.897: [Full GC (Ergonomics)  2413709K->2413471K(4247552K), 0.0180889 secs]
3000
0.972: [GC (Allocation Failure)  3181488K->3181318K(4877312K), 0.1505734 secs]
1.122: [Full GC (Ergonomics)  3181318K->3181080K(5798400K), 0.0207634 secs]
4000
1.321: [GC (Allocation Failure) -- 4579352K->5802028K(5824000K), 0.2306780 secs]
1.552: [Full GC (Ergonomics)  5802028K->4574691K(7000064K), 0.0412160 secs]
5000
1.683: [GC (Allocation Failure) -- 5802028K->6977828K(7000064K), 0.2326833 secs]
1.915: [Full GC (Ergonomics)  6977828K->5793490K(7000064K), 0.0411068 secs]
6000
7000
2.043: [Full GC (Ergonomics)  6977828K->6974201K(7000064K), 0.1676370 secs]
2.211: [Full GC (Ergonomics)  6977828K->6977131K(7000064K), 0.0248826 secs]
2.236: [Full GC (Allocation Failure)  6977131K->6977119K(7000064K), 1.0004488 secs]
7144 Memory full
0
3.237: [Full GC (Ergonomics)  6977816K->6976142K(7000064K), 1.1094352 secs]
1
4.346: [Full GC (Ergonomics)  6977816K->6976142K(7000064K), 1.0821330 secs]
2
5.429: [Full GC (Ergonomics)  6977816K->6976142K(7000064K), 1.0057587 secs]
3
6.435: [Full GC (Ergonomics)  6977816K->6976142K(7000064K), 0.9934119 secs]
4
7.428: [Full GC (Ergonomics)  6977816K->6976142K(7000064K), 1.0060575 secs]
5
8.435: [Full GC (Ergonomics)  6977816K->6976142K(7000064K), 0.9925522 secs]
6
9.427: [Full GC (Ergonomics)  6977816K->6976142K(7000064K), 1.0048095 secs]
7
10.432: [Full GC (Ergonomics)  6977816K->6976142K(7000064K), 0.9968477 secs]
8
11.430: [Full GC (Ergonomics)  6977665K->6976142K(7000064K), 1.0109500 secs]
9
12.441: [Full GC (Ergonomics)  6977480K->6976142K(7000064K), 1.0050952 secs]
10
13.446: [Full GC (Ergonomics)  6977361K->6976142K(7000064K), 0.9977489 secs]
11
14.444: [Full GC (Ergonomics)  6977283K->6976142K(7000064K), 1.0184425 secs]
12
15.463: [Full GC (Ergonomics)  6977232K->6976142K(7000064K), 1.0601230 secs]
13
16.523: [Full GC (Ergonomics)  6977199K->6976142K(7000064K), 1.0214882 secs]
14
17.545: [Full GC (Ergonomics)  6977178K->6976142K(7000064K), 1.0136330 secs]
Done

可以看出,第一个循环速度很快,2秒内大约迭代了7000次。

一旦内存满了,第二个循环每次迭代都需要运行一次GC,每次GC运行大约1秒。

关于java - 由于持续的 GC,强制 JVM 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44035964/

相关文章:

java - JVM 在具有相同标志的情况下运行方式非常不同

Java堆增长

java - 服务器(java)无法使用 SSL 连接从客户端(c#)接收 XML

javax.el.PropertyNotFoundException : Property 'AuthFirstName' not found on type entity.

java - 无法让 JavaPNS 用于推送通知

java - JVM JIT 实际做什么的任何例子?

java - Java 字节码中的平台独立性

java - 诸如对象更改监听器之类的东西?

garbage-collection - d 垃圾收集器和实时应用程序

android - 无法识别的 VM 选项 'MaxPermSize=512m' 错误 : Could not create the Java Virtual Machine. 错误 : A fatal exception has occurred. 程序将退出