【问题标题】:Java Native Memory Usage in Java 8 on HerokuHeroku 上 Java 8 中的 Java 本机内存使用情况
【发布时间】: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 服务器,从那以后它运行良好。

标签: java heroku memory


【解决方案1】:

82 MB 的已提交元空间(我可以从 jcmd 输出中看到)对于 Java 应用程序来说非常典型。 JVM 必须将所有类、框架和库加载到内存中。

您可以通过删除一些库来进行试验,看看这是否会降低非堆内存。

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 2017-02-14
    • 2011-04-08
    • 2011-01-30
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多