我有一个很小的java控制台应用程序,我想在内存使用方面进行优化。它是在Xmx设置为仅64MB的情况下运行的。根据不同的监视工具(htop、ps、pmap、Dynatrace)显示进程的总体内存使用量超过250MB。我主要在Ubuntu18上运行它(也在其他操作系统上测试)。
我使用了-xx:nativeMemoryTracking,java param和jcmd的本地内存跟踪,以找出为什么在堆之外使用了如此多的内存。
NMT在汇总时显示的值与htop作为驻留内存显示的值大致相同。
Total: reserved=1518873KB, committed=255877KB
Total: reserved=1475110KB, committed=209218KB
NativeMemoryTracking报告的提交内存可能少于进程的实际驻留集大小(RSS),原因有多种。
>
NMT只计算某些JVM结构。它不计算内存映射文件(包括加载的.jar文件),也不计算由libjvm
以外的库分配的内存。甚至由标准类库(即libjava
)分配的本机内存也没有显示在NMT报表中。
当某个东西用标准系统分配器(malloc
)分配内存,然后释放它时,这些内存并不总是返回给OS。系统分配器可能会将释放的内存保存在池中以备将来重用,但从操作系统的角度来看,该内存被认为是已使用的(因此包含在RSS中)。
关于Java应用程序使用的驻留内存,我有两个问题。 一些背景细节: 我用-xms2560m-xmx2560m设置了一个java应用程序。 java应用程序在容器中运行。k8s允许容器最多消耗4GB. 堆:应用程序的工作方式似乎是使用所有内存,然后释放,然后使用等等。 这张快照说明了这一点。Y列是空闲堆内存。(由应用程序通过)提取) 我还可以使用HotSpotDiagnosticMXBean来确认它
问题内容: 我们在 Tomcat 服务器上部署了一个Web应用程序。我们运行某些计划的作业,然后堆内存达到峰值并稳定下来,一切似乎都很好。但是,系统管理员抱怨内存使用率(Linux上的“ top”)随着计划的作业的增加而不断增加。堆内存和CPU内存之间有什么关联?可以通过任何JVM设置来控制它吗?我使用 JConsole 监视系统。 我通过JConsole强制进行垃圾收集,并且堆使用率下降了,但是
问题内容: jvm进程的内存使用量一直在增加,并且从未减少。我通过在linux服务器上执行top进行检查。该应用程序正在将作业调度到群集(使用Quartz + SunJava DRMAA API) Java堆空间在应用程序生命周期内保持在限制之内,但是jvm进程显示内存使用率稳定增长且从未下降。 这是内存泄漏吗?如果是这样,为什么堆空间在限制之内。有人可以解释一下。 更新: 当我通过jconsol
问题内容: 我需要监视应用程序产生的线程消耗的内存量。如果贪婪的线程消耗太多内存,则想法是采取纠正措施。我已提到Java线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下:
我需要监控应用程序生成的线程所消耗的内存量。如果贪婪的线程占用了太多内存,那么我们可以采取纠正措施。我提到了我的java线程需要多少内存?。关于该链接的建议之一是在ThreadMXBean中使用getThreadAllocatedBytes 我用以下作业试验了getThreadAllocatedBytes。 我在四个线程上运行了相当长的时间。虽然作业不会连续累积内存,但getThreadAlloc
与这两个问题相关的是: null Java Buildpack自动为和设置sane值。通过调优参数和配置预期线程的(最大)数量,我非常确定Java进程消耗的内存应该小于我分配给云铸造应用程序的上限。 但是,我仍然会遇到Cloud Foundry“内存不足”错误(不是Java OOM错误!): 我尝试了设置。将该值设置为1或2会导致启动缓慢。在的情况下,我仍然看到了上面描述的错误,所以这不是我的问题