- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们有一些使用 docker 运行 java 进程的容器。我们一直注意到的一件事是,仅通过运行一个简单的 spring-boot 应用程序就占用了大量内存,甚至没有包含我们自己的代码(只是为了尝试获得某种内存配置文件,而不受我们可能引入的任何问题的影响) ).
我看到的是 docker/JVM 消耗的内存在 2.5 左右徘徊。我们确实在其中包含了相当数量的额外依赖(camel、hibernate、一些 spring-boot 依赖),但这并不是真正让我失望的原因。我看到的是,尽管 docker 说它为应用程序消耗了 2.5GB 的内存,但针对它运行 jconsole 读取它消耗了高达 1GB(在 GC 之后下降到 ~200MB 并且缓慢攀升)。 docker 上的内存占用也保持在 GC 之后的位置(2.5GB)。
此外,当我转储堆以查看哪些类型的对象正在占用该空间时,在我将 .hprof 文件加载到 MAT 后,堆看起来只有 33MB 大。这些对我来说都没有多大意义。目前,我正在查看 jconsole 中报告的非堆空间为 115MB,而堆空间为 331MB。
我已经(在 SO 和其他网站上)阅读了大量关于 JVM 内存区域的文章,以及一些专门报告堆转储可能更小的内容,但它们都不是我能说的这么远,除此之外,许多建议要注意的事情是,只要进行堆转储,GC 就会运行,并且 MAT 有一个设置来显示或隐藏无法访问的对象。所有这些在发帖之前都已考虑在内,现在我只是觉得有其他事情在起作用,我无法捕捉到自己,而且我还没有在网上找到。
我完全预计这些数字可能会有点偏差,但在最好的情况下它们偏差了 10 倍,而在查看 docker 报告的内存使用情况时偏差了近 100 倍,这似乎是极端的.
有谁知道我在这里可能遗漏了什么?
编辑:这也是一个使用 Java 8 运行的应用程序,尚未使用 Java 11 运行。它在 JIRA 板上要做,但尚未计划。
EDIT2:添加屏幕截图。 JConsole 屏幕截图中的尖峰来自运行 GC。
最佳答案
JConsole 为您提供已提交的内存量:3311616 KiB ~= 3GiB正如操作系统所见,这是您的 Java 进程消耗的内存量。
它与当前用于保存 Java 对象的堆大小无关,JConsole 也报告为 130237 kbyte ~= 130 MiB。
这也与实际存活的对象数量无关:默认情况下,当您加载堆转储时,MAT 将删除无法访问的对象。您可以通过转到 Preferences -> Memory Analyzer -> Keep Unreachable Objects 来启用该选项(参见 the MAT documentation)。因此,如果您有很多生命周期短的对象,则差异可能会非常大。
我看到它还报告了大约 9GiB 的最大堆。这意味着您已将 Xmx 参数设置为较大的值。
热点 GC 不太擅长回收未使用的内存。他们倾向于使用所有可用的空间(最大堆大小,由 Xmx 设置),然后从不取消提交堆,有效地将其保留给 Java 进程,而不是将其释放给操作系统。
如果你想从操作系统的角度最小化你的进程的内存占用,我建议你设置一个较低的Xmx,可能是-Xmx1g,这样就不会让Java增长太多(当然,Xmx也会需要足够高以适应您的应用程序工作负载!)。
如果真的想要自适应堆,您还可以切换到 G1 (-XX:+UseG1GC) 和更新的 Java,因为热点团队已交付 some improvements最近。
关于java - JConsole 堆转储比内存使用量小得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55795546/
大家好, 我正在尝试使用 jconsole 连接到远程 Wildfly 8 Final 服务器。那不起作用:连接失败。经过多次尝试和失败后,我试图让它至少连接到我的“localhost”jboss,但
我尝试运行JConsole来分析正在运行的进程使用的内存,但是即使我绝对确定一个进程正在运行,JConsole也不会向我显示进程(除了它还应该在进程列表中显示JConsole之外,但它不)。 有谁知道
如何将 jconsole 输出保存在日志文件中? 我尝试添加logging.properties,但它已被忽略: jconsole.exe -Jjava.util.logging.config.fil
当您启动 jconsole 或 VisualVM 时,它们会向您显示可以附加和监视的“本地运行的 Java 应用程序”列表。 它如何知道本地运行的应用程序存在哪些? 最佳答案 引自VisualVM d
我想避免为进程分配特定的 TCP 端口,但仍然能够与其中的 JMX MBean 建立(本地)连接。我不断看到证据表明这应该是可能的,但我无法弄清楚我将使用什么作为 JNDI 名称来引用某些此类进程,或
我正在使用 jconsole 连接到远程 jboss 服务器。由于某种原因,除 MBean 之外的所有选项卡都被禁用,我如何设置 jboss 运行配置以允许远程内存监控? 我正在使用以下链接连接到 j
我是trying to use JConsole to see if I have a memory leak但不知道要寻找什么。如果非要我猜的话,内存使用率应该总是上升,尽管有垃圾回收,如下所示:
我监控了一个 Java7 应用程序几个星期,我观察到了一些我想了解的事情。 从应用程序开始加载类的总数不断增长,我认为这是正常的,因为应用程序(基于 netty 3.6 库)每小时打开和关闭大量 tc
我正在尝试使用其 Main 类从命令行启动 JConsole。 我提取了 jconsole.jar 的内容,在 MANIFEST.MF 中我可以看到 Main-Class: sun.tools.jco
我正在尝试熟悉 JMX,并且一直在使用 Oracle 教程来帮助我加快速度。根据this链接,我应该运行 Java 应用程序,然后运行 jconsole。 然而,即使我安装了 JDK 1.6.0_
我经常使用jconsole连接本地tomcat。是否可以不通过 PID 而是通过进程名称进行连接?因为今天我必须多次重启 tomcat,每次我需要连接 jconsole 以调用 mbean 上的某些操
我有一个多线程数据加载作业,一直在崩溃。我在 jconsole 中观看它,类区域似乎呈指数级增长。我在我设置的地方找到了这个 javassist.ClassPool ClassPool.doPruni
我正在使用 JConsole 访问我的应用程序 MBean。目前还没有适当的身份验证。当用户通过 Jconsole 访问它时,我想进行基于用户名/密码的身份验证。 我在 google 上进行了搜索并尝
我们有一些使用 docker 运行 java 进程的容器。我们一直注意到的一件事是,仅通过运行一个简单的 spring-boot 应用程序就占用了大量内存,甚至没有包含我们自己的代码(只是为了尝试获得
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在为我的项目做负载测试,当我尝试使用 jconsole 来监视服务器何时重新启动连接丢失时,有什么解决方案吗? 谢谢 最佳答案 jconsole 连接到一个进程,当服务器重新启动时它获得一个新的进
我正在使用 VNC 连接到服务器。我能够通过 VNC 连接到服务器并打开 Jconsole,但无论我包含 PID 还是尝试使用 GUI 进行连接,都无法让它连接到我的进程。奇怪的是所有进程都显示在 G
Console工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定。双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器。
我最近开始学习J。 如果发现它在学习一门新语言时能够快速 将一些源代码映射到输出并将其存储以供以后在 Emacs 组织模式中引用。 但是我遇到了神秘的问题 jconsole当我想做评估时。 例如 jc
是否可以在通过命令行启动时将受监控资源的凭据传递给 JConsole。我现在得到了这样的命令。 ${jdk.home}/bin/jconsole.exe -J-Djava.class.path
我是一名优秀的程序员,十分优秀!