gpt4 book ai didi

java堆内存管理内存不足

转载 作者:行者123 更新时间:2023-11-30 07:45:57 24 4
gpt4 key购买 nike

当 netty 异步服务器和客户端项目在 linux 上运行时,它会耗尽所有可用内存,如下所示: linux console

所以我在 Windows 上运行它,JMC 像这样显示堆:

JMC memory

我的问题是:为什么 windows 和 linux 的行为不同,有没有什么地方可以配置 linux jvm 来释放堆内存?以及为什么windows中会有堆释放(GC)?如何找出占用大量内存的可疑代码?

编辑:linux是4G,windows是8G,但我不认为绝对值会导致运行结果的差异。项目不直接处理原始bytebuff,它使用HttpServerCodecHttpObjectAggregator 作为bytebuf。在 linux 中运行的命令是 java -jar xx.jar。我不仅想知道为什么不同,为什么锯齿,还想知道如何定位占用这么多内存的那个。 JMC又出图了,不知道为什么一个线程可以有这么高的 block 数。 netty 线程 IO 有 99LINE 71ms。 JMC threads

更新:现在我想定位是哪部分代码占用了这么多内存。 JMC 堆显示 EDEN SPACE 非常高,我 bing 它并发现 EDEN SPACE 用于 new 对象。原来项目使用spring-boot,容器是tomcat servlet 3.0,客户端是apache httpclient pool,现在改成netty异步server和netty异步client,只改了这部分,其他部分保留(还是用spring做) bean 管理)。 Netty 服务器和客户端处理程序为所有请求共享(处理程序是单例 spring bean)。有了这么小的变化,我不相信 new 对象的数量会显着增加到 1.35G 内存 JMC heap

UPDATE分别运行netty和springboot项目后,得到更多的统计数据:

  1. 操作系统内存 8G。 springboot版项目:PS Old Generation: capacity=195MB;使用=47MB;使用了 24%。它有 692,971 个对象,总大小为 41,848,384。
  2. 操作系统内存 16G。 netty版项目:PS Old Generation: capacity = 488MB;已用 327MB;使用了 67%。它有 1,243,432 个对象,总大小为 221,427,824。

netty 版本:堆转储显示它具有类 io.netty.buffer.PoolSubpage 的 279,255 个实例,而类 org.springframework.core.MethodClassKey< 的第二大 7,222 个实例。两个版本都有服务(我们自己的类)对象限制,不超过3000个。

我尝试在 4G 内存 linux 上使用 -Xmx1024m 运行,仍然会导致同样的内存不足问题。

最佳答案

您在 Windows 上看到的行为是正常的 GC 行为。应用程序正在生成垃圾,然后您达到了导致 GC 运行的阈值。 GC 释放了大量堆。然后应用程序再次启动。结果是堆占用率呈锯齿状。

这是正常的。每个 JVM 的行为或多或少都像这样。


Linux 上的行为看起来像是在尝试在 native 内存中分配较大的内存 (77MB),但失败了,因为操作系统拒绝为 JVM 提供那么多的内存。通常发生这种情况是因为操作系统资源耗尽;例如物理 RAM、交换空间等。

Windows 8G, linux 4G.

这可能解释了它。你的 Linux 系统只有 Windows 系统的一半物理内存。如果您正在使用大型 Java 堆运行 netty,并且您的 Linux 操作系统没有配置任何交换空间,那么 JVM 可能正在使用所有可用的虚拟内存。它甚至可能在 JVM 启动时发生。

(如果我们假设 Windows 和 Linux 的最大堆大小设置相同,那么在 Windows 上至少有 4.5GB 的虚拟地址空间可用于其他东西。在 Linux 上,只有 0.5GB。而且0.5GB 必须容纳所有非堆 JVM 利用率......加上操作系统和各种其他用户空间进程。很容易看出你如何使用所有这些......导致分配失败。)

如果我的理论是正确的,那么解决方案就是更改 JVM 命令行选项,使 -Xmx 变小。

(或者增加可用的物理/虚拟内存。但是通过添加交换空间来增加虚拟内存时要小心。如果虚拟/物理比率太大,您可能会得到虚拟内存“抖动”,这会导致糟糕的性能。 )

关于java堆内存管理内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51148274/

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