问题标签 [jcmd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在 JDK-8 java 进程上使用 JDK-11 运行 jcmd 未成功运行
我正在尝试使用 jcmd 监视 tomcat 的本机内存,但出现以下异常:命令:jcmd 14533<pid of tomcat> VM.native_memory summary
我已经安装了 2 jdk's
jdk-11
AND jdk-8
。
Tomcat正在运行jdk-8
并使用jcmdjdk-11
然后我得到以下异常:
我-XX:+StartAttachListener
与java进程连接,但它没有工作。
java - 从正在运行的 JVM 获取特定类的平均大小
我正在尝试获取正在运行的 JVM 中某个类的所有实例的平均大小。我可以使用 jcmd 或类似工具创建堆转储,但这需要几秒钟,这是一个生产服务器,所以我宁愿有更快的东西。jcmd 有一个选项可以创建这种格式的直方图:
这似乎很有希望,但我认为字节大小是浅的而不是保留的内存。有没有办法创建具有保留大小的相同直方图?或者也许是另一种快速获取类实例平均大小的方法?
我知道 GDB 方法,但它不适合,因为命令序列将花费我几秒钟的时间来输入,而这大约是使用 jcmd 进行堆转储所需的时间。
java - jhat -baseline 功能不适用于 HeapDumpOnOutOfMemoryError 和 jcmd GC.heap_dump 生成的基线
我有一个突然的内存泄漏,它发生在相当瞬间,所以我必须使用 HeapDumpOnOutOfMemoryError 捕获转储。但是要查看真正导致这种巨大内存峰值的原因,我需要先获取一个基线,然后我会使用jcmd $pid GC.heap_dump baseline.hprof
它。当创建崩溃堆转储时,我说jhat -baseline baseline.hprof java_pid1234.hprof
我没有正确减去基线,是否添加 -baseline 选项没有区别。输出说它做了减法:
但这没有区别!这是为什么?在此处报告的 10 年前的问题中 为什么 jhat 的 -baseline 选项不起作用?它说有关使用 jmap 生成的堆转储的内容不兼容,但我没有使用 jmap。
有什么方法可以调用与此 HeapDumpOnOutOfMemoryError 用于创建基线的代码完全相同的代码吗?
我想我会尝试触发这个内存转储两次。但这很不方便,而且 [更新] 这甚至不起作用!此内存转储仅创建一次。我创建了这个函数:
当我运行它时,它会这样做:
但我第二次称它为:
所以这让我卡住了!
PS:请不要告诉我有关 Eclipse 或其他 IDE 的信息,我基本上是在无头运行。
更新:我仍然想知道为什么会这样,因为它很烦人。但我给自己写了一个解决方法:
这是有效的,因为它使用 OutOfMemory 也使用的相同 dumpHeap 函数。
另一个更新:这似乎有效,但出于我的目的,它仍然不起作用。Windows 上的 Oracle Java 1.8。这非常令人沮丧。所有这些工作我一无所获。我仍然在 jhat 直方图中看到所有基线数据。
java - 执行 jcmd GC.class_stats 时会导致 STW 吗?
我将jcmd $PID GC.class_stats -csv=true
在我的 tomcat 进程上执行命令,以获取加载的类状态。
我担心命令对 tomcat 进程的影响,比如创建堆转储。
执行命令时会导致停止世界或其他效果吗?
我找不到它。
谢谢。
java - Java 本机内存使用量与使用的总虚拟内存不匹配
我有一个 Java 应用程序使用大量堆外内存,超出预期。本机内存跟踪表明该应用程序使用了14 GB,但从top
应用程序获得的信息来看,它使用了25.6 GB的虚拟内存。造成这种差异的原因是什么?
和顶部
该应用程序在 jdk11 上运行
java;-server;-XX:+UnlockExperimentalVMOptions;-XX:+UseShenandoahGC;-XX:ShenandoahGCHeuristics=compact;-XX:+AlwaysPreTouch;-XX:+UseNUMA;-XX:-UseBiasedLocking;-Xms10G;-Xmx10G;-XX:+DoEscapeAnalysis;-XX:+PrintConcurrentLocks;-verbose:gc;-XX:+PrintGCDetails;-XX:NativeMemoryTracking=detail;-XX:+UseContainerSupport;-XshowSettings:vm;-XX:MaxRAMPercentage=90;-XX:InitialRAMPercentage=50;-XX:+PrintFlagsFinal;-jar;/home/loro/service.jar
java - 以 -XX:NativeMemoryTracking=summary 开头的 java 进程无法识别命令 VM.native_memory
我的环境是 MacOs + Java 11:
我正在使用该-XX:NativeMemoryTracking=summary
标志启动一个 Java 程序。
当我尝试访问本机内存摘要时,出现错误:
如果我列出我得到的进程的所有可用命令:
我需要的命令不可用。为什么不在那里?我该如何启用它?
jvm - 创建在 Window 上运行的 tomcat 服务的 JVM 堆转储
尝试从作为 Windows 服务运行的 Tomcat 服务创建堆转储时,出现“访问被拒绝”错误。我以“以管理员身份运行”启动命令提示符
如何摆脱“访问被拒绝”或者是否有不同的方法来创建堆转储?
java - jcmd 的 VM.command_line 选项随时间可用
我正在使用 VM.command_line 选项运行 jcmd,如下所示,以使 JavaVM 启动命令在服务器中运行。
随着时间的推移,这将返回以下错误。
时间取决于 Java VM 上运行的应用程序的内容。在某些环境中,错误会在 10 天内发生,而在其他环境中,错误会在 27 天后发生。
从错误内容 Java 调查时 - AttachNotSupportedException: Unable to open socket file: HotSpot VM not loaded
由非 JavaVM 启动用户的用户执行时发生的错误,该用户在经过一段时间之前和之后都没有更改此事件。由于随着时间的推移发生错误,因此无法确定原因。重新启动Java进程时不会出现上述错误但是,过了一段时间(大约10天),错误再次出现。
我需要帮助,因为我无法确定原因。
java - 如何在安装了 openJDK 的 docker 容器上运行没有 JDK 的 JCMD
我需要在 prod 上运行 JCMD 来监控我的应用程序,但不幸的是我没有合适的 JDK,所以我需要使用 JRE 运行它。我可以添加一些依赖项,但不能添加整个 jdk。
我正在使用 openJDK 8。
有谁知道该怎么做?
这里已经发布了一个问题(How to run jcmd without the JDK?),但答案适用于 windows 服务器,不适用于 docker 容器中的 linux OS。
java - jcmd 的 VM.command_line 选项在重新启动 JavaVM (1.8.0_222) 后变得不可用
为了获得在服务器(基于 RHEL7 / CentOS7)中运行的 JavaVM (1.8.0_222) 的应用程序启动命令,添加 jcmd (jdk1.8.0_66) 和 VM.command_line 选项,如下所示(每分钟 1 个)。运行(连续)次。
"jcmd {process ID} VM.command_line" 将在重新启动 JavaVM (1.8.0_222) 应用程序后返回错误。
我还每分钟运行一次“jcmd {process ID} PerfCounter.print”,它工作正常。
目前,我已确定原因并每隔 15 分钟重新启动 JavaVM (1.8.0_222) 应用程序。
我正在尝试创建 10 个相同的服务器。总共大约 3000 次重新启动后发生。虽然一个事件发生的概率很低,
我无法确定造成这种情况的原因。