java - 内存耗尽 Xmx 和 Xms 一侧

标签 java memory-management jconsole

我编写的 java 应用程序遇到了导致硬件性能问题的问题。问题(我相当确定)是我运行该应用程序的一些机器只有 1GB 内存。当我启动 java 应用程序时,我将堆大小设置为 -Xms 512m -Xmx 1024m。

我的第一个问题是,我的假设是否正确,因为我将所有机器内存分配给 java 堆,这显然会导致性能问题?

这引出了另一个问题。我在应用程序上运行 jconsole 并监视应用程序的内存使用情况。我看到的是,该应用程序在启动时消耗约 30mb,达到约 150mb,垃圾收集器运行后又回落到 30mb。我还发现在 pid 上使用 top 时,应用程序一开始使用了大约 6% 的内存,然后慢慢攀升至大约 20%。我不明白。为什么当我分配 1GB 给它时它只能获得 20% 的内存使用率。不应该达到100%吗?另外,为什么它使用那么多内存 (20%),而应用程序似乎没有使用超过 150mb 的内存?

我认为很明显我需要调整我的 Xms 和 Xmx,这应该可以解决问题,但我正在尝试更好地了解到底发生了什么。

最佳答案

内存使用的两种可能性:

您的应用程序只是不使用那么多内存

或者

您的应用使用那么多内存的速度不够快。

发生了什么:

垃圾收集器有几个执行点:

  1. 刚刚安排:它将清理易于删除的对象

  2. 完整收集:当您达到设置的内存限制时运行。

如果选项 1(一般影响较小的快速收集)可以控制内存使用,则除非将 JVM GC 选项设置为按计划运行完整收集,否则它不会进行完整收集。

对于您的应用程序,我将开始设置较低的 xmx/xms 值,以便为操作系统留下更多有保证的资源,并且可能会阻止某些分页。

关于java - 内存耗尽 Xmx 和 Xms 一侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45760977/

相关文章:

java - 在 URLClassPath 类的 Debug模式下有 MyEclipse 隐式断点

c++ - 如何显式管理异构类型(和大小)的多个池分配器?

objective-c - Objective C 内存问题

java - linuxbox 上的 Jconsole

java - 尝试加快 java 中 Socket 的读取速度

java - 使用jsp形式编辑MYSQL记录

java - 如何使用 StAX 添加架构位置

delphi - 当我释放 Delphi 中可能不存在的内存时会发生什么?

JMX 引发通知时引发 java.io.NotSerializedException

java - 监控 Ehcache 统计信息?