gpt4 book ai didi

Java大对象垃圾回收

转载 作者:行者123 更新时间:2023-12-01 12:00:29 25 4
gpt4 key购买 nike

我有 JVM 参数 (JVM 1.8.20)

-Xmx40M -Xms40M -verbose:gc   -XX:+PrintGCDetails

和代码:

public static void main(String[] args) {
byte[] memory = null;
int MB = 1024 * 1024;
int c = 0;
while(c++<10){
memory = new byte[(int) (10 * MB)];
}

}

每次迭代后都会有GC:

[GC(分配失败)[DefNew: 932K->472K(12288K), 0.0010986 秒] 932K->472K(39616K), 0.0011674 秒] [时间: user=0.00 sys=0.00, real=0.00 秒]

[GC(分配失败)[DefNew: 10931K->472K(12288K), 0.0053905 秒] 10931K->10712K(39616K), 0.0054285 秒] [时间: user=0.00 sys=0.00, real=0.01 秒]

[GC(分配失败)[DefNew: 10712K->472K(12288K), 0.0057686 秒] 20952K->20952K(39616K), 0.0058082 秒] [时间: user=0.01 sys=0.00, real=0.00 秒]

[GC(分配失败)[DefNew:10712K->10712K(12288K),0.0000173 秒][Tenured:20480K->10711K(27328K),0.0041701 秒] 31192K->10711K(39616K),[元空间:85K->85K(4480K)], 0.0042462 秒] [时间: user=0.00 sys=0.00, real=0.00 秒]

[GC(分配失败)[DefNew: 10240K->0K(12288K), 0.0033846 秒] 20951K->20951K(39616K), 0.0034223 秒] [时间: user=0.00 sys=0.00, real=0.00 秒]

[GC(分配失败)[DefNew:10240K->10240K(12288K),0.0000158 秒][Tenured:20951K->10711K(27328K),0.0040890 秒] 31191K->10711K(39616K),[元空间:85K->85K(4480K)],0.0041566秒] [时间:user=0.02 sys=0.00,real=0.00秒]

[GC(分配失败)[DefNew: 10240K->0K(12288K), 0.0026607 秒] 20951K->20951K(39616K), 0.0026945 秒] [时间: user=0.00 sys=0.00, real=0.00 秒]

[GC(分配失败)[DefNew:10240K->10240K(12288K),0.0000169 秒][Tenured:20951K->10711K(27328K),0.0039672 秒] 31191K->10711K(39616K), [元空间: 85K->85K(4480K)], 0.0040413 秒] [时间: user=0.00 sys=0.00, real=0.00 秒]

[GC(分配失败)[DefNew: 10240K->0K(12288K), 0.0026438 秒] 20951K->20951K(39616K), 0.0026780 秒] [时间: user=0.01 sys=0.00 ,实际=0.00秒]

[GC(分配失败)[DefNew:10240K->10240K(12288K),0.0000158 秒][Tenured:20951K->10711K(27328K),0.0037923 秒] 31191K->10711K(39616K), [元空间: 85K->85K(4480K)], 0.0038584 秒] [时间: user=0.00 sys=0.00, real=0.01 秒]

查看GC日志,堆中始终有20M被占用。但是每次迭代后应该有 10M Activity 对象。

你能帮我理解为什么有20M被占用吗?

最佳答案

我认为您误解了日志。大多数时候你有 10M 的占用率,这就是你的基线——运行时在空闲时使用的数据。仅偶尔我们会看到 GC 后仍保留一个数组(即箭头后显示大约 20000 K 的条目)。

您选择以粗体强调的数字是特定 GC 算法运行的详细结果。唯一相关的数字是那些单独嵌套在方括号内的数字。

我还要指出,您的代码永远不会保留数组,它在创建时就变成了垃圾。这是因为 内存 是一个局部变量,您永远不会从中读取数据。

关于Java大对象垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com