【发布时间】:2018-05-09 19:57:24
【问题描述】:
我在控制内存使用时遇到了问题,并且我已经用尽了我所知道的或在网络上可以找到的所有内容(显然 Google 不支持我)。下面是 Heroku 内存报告的截图,你可以看到我的堆和元空间都在我允许的范围内。当我运行本机内存摘要时,它显示我的类空间使用的方式比我想要的要多,但我找不到任何关于如何在 Java 8 中调整它的信息。我的应用程序非常小而且 GC(我会认为)应该在课堂空间达到它的水平之前释放它。有什么想法吗?
JAVA_OPTS 和 Heroku 指标页面如下:
-Xmx128m
-Xss512k
-XX:MaxMetaspaceSize=128m
-XX:+UseSerialGC
-XX:ReservedCodeCacheSize=20m
-XX:CompressedClassSpaceSize=20m
-XX:NativeMemoryTracking=detail
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintNMTStatistics
@codefinger 要求更新
这是我的Procfile:
java $JAVA_OPTS -Dserver.port=$PORT -jar build/libs/*.jar
我之前有 JVM_OPTS 作为我的环境变量,但在 Procfile 和环境变量中的任何地方它始终是 JAVA_OPTS。这只是我在 SO 中的一个错字。
@codefinger 要求的更新 2
这是jinfo -flag MaxHeapSize 4的输出:
Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -Dfile.encoding=UTF-8
-XX:MaxHeapSize=134217728
更新 3 - 来自jcmd 4 VM.native_memory summary 的其他详细信息
- Java Heap (reserved=131072KB, committed=131072KB)
(mmap: reserved=131072KB, committed=131072KB)
- Class (reserved=94577KB, committed=82673KB)
(classes #14554)
(malloc=2417KB #12980)
(mmap: reserved=92160KB, committed=80256KB)
- Thread (reserved=84165KB, committed=84165KB)
(thread #37)
(stack: reserved=21648KB, committed=21648KB)
(malloc=118KB #182)
(arena=62399KB #73)
- Code (reserved=21880KB, committed=13432KB)
(malloc=1080KB #2290)
(mmap: reserved=20800KB, committed=12352KB)
- GC (reserved=462KB, committed=462KB)
(malloc=30KB #314)
(mmap: reserved=432KB, committed=432KB)
- Compiler (reserved=267KB, committed=267KB)
(malloc=136KB #685)
(arena=131KB #3)
- Internal (reserved=2693KB, committed=2693KB)
(malloc=2661KB #17480)
(mmap: reserved=32KB, committed=32KB)
- Symbol (reserved=19827KB, committed=19827KB)
(malloc=16047KB #165359)
(arena=3780KB #1)
- Native Memory Tracking (reserved=3768KB, committed=3768KB)
(malloc=496KB #7906)
(tracking overhead=3272KB)
- Arena Chunk (reserved=1189KB, committed=1189KB)
(malloc=1189KB)
【问题讨论】:
-
您有多大把握
JVM_OPTS被您的Java 进程拾取?你能发布你的Procfile吗? -
不错,@codefinger。我没有想到这一点,但它看起来一直是
JAVA_OPTS,除非我在 SO 中输入它。问题已更新。 -
你可以使用
heroku ps:exec运行jinfo -flag MaxHeapSize PID并分享输出。也可以检查InitialHeapSize。 -
嗨。你找到解决办法了吗?我的行为和你一样。
-
没有“真正的”解决方案。我最终从 Heroku 转移到我管理的专用服务器。不理想,但我不能凭良心推荐 Heroku,因为我最终需要运行应用程序所需的内存量。 Heroku 是一个微服务平台,而不是单体应用的地方。不幸的是,即使是一个相对较小的 Spring Boot 应用程序对我来说也是一个“单体”。我最终使用了具有 12G RAM 的 Linode 服务器,从那以后它运行良好。