Java - 内存不足的高级保留空间

时间:2017-08-05 09:13:18

标签: java heroku

我在具有512M内存的Heroku dyno上调试内存问题。在经过大量的探索和刺激之后,我认为我已经将它缩小到类空间而不是因为某些原因而被清理干净。这是jcmd <pid> VM.native_memory summary

的输出
Java Heap (reserved=163840KB, committed=163840KB)
  (mmap: reserved=163840KB, committed=163840KB)


Class (reserved=1120210KB, committed=80466KB)
  (classes #14208)
  (malloc=2002KB #18418)

  (mmap: reserved=1118208KB, committed=78464KB)

Thread (reserved=26165KB, committed=26165KB)
  (thread #45)
  (stack: reserved=25776KB, committed=25776KB)
  (malloc=144KB #222)
  (arena=244KB #89)

Code (reserved=256694KB, committed=42130KB)
  (malloc=7094KB #10281)
  (mmap: reserved=249600KB, committed=35036KB)

GC (reserved=569KB, committed=569KB)
  (malloc=29KB #279)
  (mmap: reserved=540KB, committed=540KB)

Compiler (reserved=217KB, committed=217KB)
  (malloc=86KB #290)
  (arena=131KB #3)

Internal (reserved=3116KB, committed=3116KB)
  (malloc=3084KB #16726)
  (mmap: reserved=32KB, committed=32KB)

Symbol (reserved=19560KB, committed=19560KB)
  (malloc=15812KB #163798)
  (arena=3748KB #1)

Native Memory Tracking (reserved=3649KB, committed=3649KB)
  (malloc=292KB #4629)
  (tracking overhead=3357KB)

Arena Chunk (reserved=198KB, committed=198KB)
  (malloc=198KB)

以下是我的JAVA_OPTS

-Xmx160m
-Xss512k
-XX:MaxMetaspaceSize=128M
-XX:NativeMemoryTracking=detail
-XX:+UnlockDiagnosticVMOptions
-XX:+UseSerialGC

知道为什么Class仍然保留了超过一堆内存?再说一遍,我甚至都不确定课堂空间是什么问题,所以任何帮助都会受到赞赏。

请注意,我使用的是一些Groovy代码,在类加载器领域可能相当嘈杂。

1 个答案:

答案 0 :(得分:1)

Java 8为压缩类指针保留1GB内存。如果您希望它保留较少的内存,您可以使用CompressedClassSpaceSize jvm参数执行此操作。这个answer以及来自oracle的guide中的一些其他详细信息。

请注意,从oracle指南看,当使用UseCompressedOopsUseCompressedClassesPointers jvm参数时,java只保留1GB,但出于某种原因,他们决定不提及默认情况下它们已启用。