当前位置: 首页 > 知识库问答 >
问题:

JVM中不断增长的驻留大小集

邵鸿福
2023-03-14

下面是一些使用的JVM标志,

  1. -xmx3500m
  2. -XMS3500M
  3. -xx:maxmetaspacesize=400m
  4. -xx:compressedclassspacesize=35m

注意:线程堆栈的大小(1MB)和代码缓存(240MB)是默认的,JDK版本是1.8.0_252。

PR   NI    VIRT     RES    SHR S  %CPU %MEM   TIME+   COMMAND   
20   0  28.859g  6.341g  22544 S 215.2 83.1   4383:23 java    
Debugger attached successfully.
Server compiler detected.
JVM version is 25.252-b14

using thread-local object allocation.
Garbage-First (G1) GC with 33 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3670016000 (3500.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 2202009600 (2100.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 36700160 (35.0MB)
   MaxMetaspaceSize         = 419430400 (400.0MB)
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 3500
   capacity = 3670016000 (3500.0MB)
   used     = 1735444208 (1655.048568725586MB)
   free     = 1934571792 (1844.951431274414MB)
   47.28710196358817% used
G1 Young Generation:
Eden Space:
   regions  = 1311
   capacity = 2193620992 (2092.0MB)
   used     = 1374683136 (1311.0MB)
   free     = 818937856 (781.0MB)
   62.66730401529637% used
Survivor Space:
   regions  = 113
   capacity = 118489088 (113.0MB)
   used     = 118489088 (113.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 249
   capacity = 1357905920 (1295.0MB)
   used     = 241223408 (230.04856872558594MB)
   free     = 1116682512 (1064.951431274414MB)
   17.76436824135799% used

485420 interned Strings occupying 83565264 bytes.
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
 0.0   33792.0  0.0   33792.0 1414144.0 1204224.0 2136064.0  1558311.7  262872.0 259709.5 19200.0 18531.5  22077  985.995  10     41.789 1027.785
 0.0   33792.0  0.0   33792.0 1414144.0 1265664.0 2136064.0  1558823.7  262872.0 259709.5 19200.0 18531.5  22077  985.995  10     41.789 1027.785
 0.0   63488.0  0.0   63488.0 124928.0 32768.0  3395584.0  1526795.8  262872.0 259709.5 19200.0 18531.5  22078  986.041  10     41.789 1027.830
 0.0   63488.0  0.0   63488.0 124928.0 49152.0  3395584.0  1526795.8  262872.0 259709.5 19200.0 18531.5  22078  986.041  10     41.789 1027.830
 0.0   63488.0  0.0   63488.0 124928.0 58368.0  3395584.0  1526795.8  262872.0 259709.5 19200.0 18531.5  22078  986.041  10     41.789 1027.830

甚至由“jcmd pid vm.native_memory summary”输出产生的总和也是5.0GB,甚至不是最接近6.3GB。所以我找不到余额1.3GB用在哪里了。

我试图找到6.3GB实际上是如何与JVM映射的。所以我决定检查/proc/pid文件夹。

在/proc/pid/status文件中,

VmRSS   : 6649680 kB 
RssAnon :   6627136 kB
RssFile :     22544 kB
RssShmem:         0 kB 
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000723000000 3607296 3606076 3606076 rw---   [ anon ]
00000007ff2c0000   12544       0       0 -----   [ anon ]
00007f4584000000     132       4       4 rw---   [ anon ]
00007f4584021000   65404       0       0 -----   [ anon ]
00007f4588000000     132      12      12 rw---   [ anon ]
00007f4588021000   65404       0       0 -----   [ anon ]
00007f458c000000     132       4       4 rw---   [ anon ]
00007f458c021000   65404       0       0 -----   [ anon ]
00007f4590000000     132       4       4 rw---   [ anon ]
00007f4590021000   65404       0       0 -----   [ anon ]
00007f4594000000     132       8       8 rw---   [ anon ]
00007f4594021000   65404       0       0 -----   [ anon ]
00007f4598000000     132       4       4 rw---   [ anon ]
00007f4598021000   65404       0       0 -----   [ anon ]
00007f459c000000    2588    2528    2528 rw---   [ anon ]

除了本机内存跟踪中提到的JVM使用的任何内存信息都将不胜感激。

共有1个答案

松烨烨
2023-03-14

正如这里所讨论的,除了本机内存跟踪所涉及的领域之外,还有其他一些事情会在JVM进程中消耗内存。

许多大小正好为64MB的匿名区域(就像您的pmap输出中一样)表明这些区域是malloc竞技场。众所周知,标准glibc分配器存在内存占用过多的问题,特别是在具有许多线程的应用程序中。我建议使用jemalloc(或tcmalloc、mimalloc)作为标准分配器的临时替代--它没有提到的漏洞。另一种解决方案是使用malloc_arena_max环境变量限制malloc竞技场的数量。

如果即使在切换到jemalloc之后问题仍然存在,这很可能是本机内存泄漏的迹象。例如,Java应用程序中的本机泄漏可能是由

    null
 类似资料:
  • 问题内容: 我们最近对生产系统的观察告诉我们Java容器的常驻内存使用量正在增长。关于此问题,我们已经进行了一些调查,以了解为什么Java进程使用pmap之类的本地工具会比堆+线程堆栈+共享对象+代码缓存+等消耗更多的内存。结果,我们发现本机进程(可能是malloc / mmap)分配了一些64M内存块(成对): 我将0000000720000000 3670016K的行解释为我们使用JVM参数“

  • 问题是,那些块是什么?哪个子系统分配这些? 更新:我们不使用JIT和/或JNI本机代码调用。

  • 我有一个在 上运行的 Java 应用程序。我观察到系统报告的Java进程的RSS使用率不断增加,它将达到超过90%的物理内存,即,我的代码将重新启动系统。另一方面,我从代码中定期打印出来的表明它总是在不超过物理内存37%的有限范围内波动(意味着 你知道发生了什么以及如何解决这个问题吗? 该系统是 板上的嵌入式 Linux。

  • 问题内容: 我的redis rdb文件的大小一直在增长,直到数据库无法运行并且连接被拒绝为止。我意识到这与某些配置设置有关-我使用的是默认配置文件。 有什么办法可以防止这种情况?我不必担心持续备份。 问题答案: 这显然在redis.conf中, 上面的文本在redis.conf中,如果您不想保存rdb文件,请在保存的三行注释,例如

  • 当运行启用了本机内存跟踪的Java应用程序(在YARN中)(请参见https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html和https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html)时,我可以看到JVM在不

  • 有很多关于堆大小的帖子和站点,但是没有一个提到在调用JVM时如何找出我可以保留的最大可能堆大小。 任务是用最大可用堆大小xmx=max动态启动我的jvm(这里不需要讨论这个任务的对象!)。 我们可以考虑读取当前可用或空闲的内存,并将该大小用于xms和XMX。但这不起作用。 调用Java程序时: Java-XMS1536M-XMX1536M myApp 导致: 选择您选中的应用程序大约需要的堆。并在