java - 堆使用相比,java应用程序的巨大系统内存使用

  显示原文与译文双语对照的内容
56 1

我有一个像java框架的microservice 。 许多java进程在单个框( ubuntu 14.04.4 ) 上运行。 java进程使用大量系统内存,因此交换空间非常重要。 jstat gc报告不解释系统的内存使用情况。 所有java进程都以参数运行


-XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90



强制JVM将内存返回给系统。 如果没有参数,问题仍然存在。 某些java组件使用nashorn引擎编写一些功能。

有人能解释一下这里的行为?

是否存在限制巨大系统内存使用的jvm patameters?

如何让操作系统对jvm的内存分配具有更严格的限制?

一些数据:

( 使用 nashorn ) 组件

顶部:


PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


2400 xxxxxx 20 0 13.933g 807496 7332 S 0.0 2.5 4180:15 java



jstat -gc 2400:


S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT


512.0 512.0 0.0 400.0 19456.0 12751.6 62464.0 59862.3 89688.0 84866.6 10624.0 9440.4 2165265 15977.896 16816 1813.836 17791.732



  • 容量:180 MB
  • 用法:165 MB
  • 系统资源:800 MB

为什么组件使用GC区域内存的4倍?

组件B ( 没有 nashorn )

顶部:


PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


19476 xxxx 20 0 13.465g 120436 7836 S 7.0 0.4 22:40.76 java



jstat -gc 19476:


S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT


512.0 512.0 0.0 0.0 41472.0 25408.7 343040.0 7164.5 17664.0 17183.1 2048.0 1919.4 3650 10.806 939 16.788 27.594



  • 容量:403 MB
  • 用法:52 MB
  • 系统资源:120 MB

这里GC区域容量比实际的系统内存使用量大。 系统的内存使用量是GC区域的两倍。 IMO这个组件的行为正常,因为库的等等 被部分映射到内存中。

组件C ( 没有 nashorn )

顶部:


PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


2272 xxxxxx 20 0 13.382g 922944 11108 S 0.7 2.8 40033:41 java



jstat -gc 2272:


S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT


1024.0 1024.0 868.0 0.0 36352.0 23866.1 76800.0 56580.2 68864.0 64571.1 8448.0 7460.6 31974159 199295.501 844692 134644.040 333939.541



  • 容量:190 MB
  • 用法:152 MB
  • 系统资源:920 MB

为什么组件使用GC区域内存的6倍?

时间: 原作者:

134 5

有人能解释一下这里的行为?

内存使用没有单一的解释,有许多相关因素。

  • 使用 NMT 获取关于JVM内部各部分分配多少内存的概述
  • 使用 pmap -x <pid> 标识内存映射的文件。
  • 使用堆转储查找直接内存缓冲区( 它们只是显示在pmap中的一些 [anon] 映射) 或者使用 Yourkit,它具有内存检查来标识直接缓冲区分配的金额。

除这里之外,你必须考虑每个JVM都带有一些基线内存消耗和需要的垃圾回收器空间。 在共享JVM中运行多个服务可以摊销这些基线成本。

由于虚拟内存系统的复杂性,你还需要注意使用。提交。保留和驻留内存系统之间的差异。

是否存在限制巨大系统内存使用的jvm patameters?

那取决于原因。

对于托管堆,可以将未使用的内存返回到操作系统更快的内存中,但是具有性能。

原作者:
...