gpt4 book ai didi

java - PermGen 会泄漏到 native 堆中吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:49 25 4
gpt4 key购买 nike

我们正在运行具有以下设置的 Glassfish 应用程序:

-XX:PermSize=1g
-XX:MaxPermSize=2g
-Xms4g
-Xmx4g
-XX:MaxDirectMemorySize=1048576

JDK版本为6u45

我们观察到内存泄漏 - Glassfish 的 java 进程不断增长 - RES 超过 15GB(我们的服务器有 16GB 的物理内存,所以管理员在达到物理限制之前重启 Glassfish),但是我们永远不会得到 java.lang.OutOfMemoryError

jmap -permstat 让应用程序长时间运行后的输出,显示类加载器正在占用 ~9.5GB (!!!):

class_loader    classes bytes   parent_loader   alive?  type

<bootstrap> 4242 24064120 null live <internal>
0x0000000794a4c030 20 274072 0x0000000794a4c098 dead groovy/lang/GroovyClassLoader$InnerLoader@0x0000000609cdc9f0
...
<many, many Groovy class loaders>
0x000000077f9c80d8 0 0 0x00000007017859f8 dead groovy/lang/GroovyClassLoader@0x0000000609997f00
0x000000076d63b3e0 0 0 0x00000007017859f8 dead groovy/lang/GroovyClassLoader@0x0000000609997f00
0x000000075a4c5248 20 261784 0x000000075a4c52b0 dead groovy/lang/GroovyClassLoader$InnerLoader@0x0000000609cdc9f0
0x000000078ea2e998 0 0 0x00000007017859f8 dead groovy/lang/GroovyClassLoader@0x0000000609997f00
...
total = 73518 745295 9690318280 N/A alive=1, dead=73517 N/A

同时 jmap -heap 显示 PermGen 使用 700MB:

PS Perm Generation
capacity = 2147483648 (2048.0MB)
used = 823831536 (785.6669769287109MB)
free = 1323652112 (1262.333023071289MB)
38.362645357847214% used

我一直认为使用 -XX:MaxPermSize-Xmx 可以控制 java 进程分配多少内存(抛出 OOM 以防需要更多)。据我所知,这个过程大约需要:

4G (heap) + 2G (PermGen) + N*1MB (N thread's stacks) ~= 7.5G (by 500 threads)

问题

我们知道泄漏来自旧的 Groovy 版本和缺少 PermGen 清除标志,但是类加载器占用 9.5GB 的内存怎么可能既不属于 PermGen 也不属于 java 堆?


编辑

只是澄清一下 - 问题不是如何解决内存泄漏问题,而是关于JVM 为什么允许这样的内存分配

最佳答案

与其说是答案,不如说是。这很棘手。请注意,JVM 将为 Garbage collection(尤其是 G1)、元空间:Java8 中的 Permgen(因此不适用于您的情况)、JIT 优化和 direct buffers 使用额外的 Swing 空间。可能驻留在正常的垃圾收集堆之外。

在任何一种情况下,分析堆转储以查看应用程序行为是什么。一般来说,这个错误在应用程序中而不是在 JVM 中。此外,您应该让应用程序运行到 OutOfMemory 并查看提到的确切原因。

关于java - PermGen 会泄漏到 native 堆中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31119975/

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