我经常使用jstat来获取GC相关的统计信息.但是,有时候我根本无法从JVM获取任何统计信息.它只是说它无法找到进程ID,即使它是正确的id.
挖掘稍微深一点,似乎与"/ tmp/hsperfdata"相关文件有关.在具有此目录/文件的服务器上,jstat按预期工作(jps也显示正确的实例).在它失败的服务器/实例上,我没有看到"/ tmp/hsperfdata"目录(并且jps不报告pid).
有没有其他人遇到这个?我在某地读到需要正确设置TMP变量,但我没有看到它工作的服务器帐户和不工作的服务器帐户之间的环境设置有任何差异.
$ jcmd -l
418 sun.tools.jcmd.JCmd -l
$ jstat -gcutil -t 10 250ms 1
10 not found
Run Code Online (Sandbox Code Playgroud)
我知道jdk中有关将jstat作为root连接到以不同用户身份运行的进程的错误.
这里,这个docker容器有一个用户root,从ps命令可以看出,cassandra在root下运行.
$ whoami
root
Run Code Online (Sandbox Code Playgroud)
我试图做以下事情: $ sudo -u root jcmd -l
任何帮助表示赞赏.
Docker容器是debian:jessie运行java版本:openjdk版本"1.8.0_66-internal"
这是ps -ef的输出:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 17:40 ? 00:00:00 /bin/bash /run.sh
root 10 1 11 17:40 ? 00:02:25 java -ea -javaagent:/usr/share/c
root 375 0 0 17:49 ? 00:00:00 bash
root 451 375 0 18:00 ? 00:00:00 ps -ef
Run Code Online (Sandbox Code Playgroud)
旁白:jstack成功转储了线程的堆栈跟踪.
我正在运行jvm (java 8)带有参数“ -XX:MetaspaceSize=256M and -XX:MaxMetaspaceSize=256M”的。当我执行“ jstat -gcmetacapacity <PID>”时,它输出,
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1157120.0 122880.0 0.0 1048576.0 14336.0 499 5 1.131 12.653
Run Code Online (Sandbox Code Playgroud)
我希望既MCMN和MCMX为256M。
这看起来类似于错误http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8077987。但它已被 MC 的文档修复所关闭。我希望它是 jstat 错误并且 java 配置是正确的。有没有其他方法可以确认这一点?
爪哇版
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
Run Code Online (Sandbox Code Playgroud) 我目前正在调查压缩类空间问题。我知道问题是什么,但在调查时,我注意到这一点jstat -gc ...,并jcmd ... GC.heap_info给出了不同数量的元空间和压缩类空间容量和使用情况:
\xe2\x96\xb6 jcmd 32152 GC.heap_info\n32152:\n PSYoungGen total 153600K, used 129316K [0x00000000eab00000, 0x00000000f5b00000, 0x0000000100000000)\n eden space 137728K, 91% used [0x00000000eab00000,0x00000000f26abf48,0x00000000f3180000)\n from space 15872K, 16% used [0x00000000f4100000,0x00000000f439d428,0x00000000f5080000)\n to space 15872K, 0% used [0x00000000f3180000,0x00000000f3180000,0x00000000f4100000)\n ParOldGen total 290816K, used 21446K [0x00000000c0000000, 0x00000000d1c00000, 0x00000000eab00000)\n object space 290816K, 7% used [0x00000000c0000000,0x00000000c14f1ac0,0x00000000d1c00000)\n Metaspace used 59690K, capacity 64980K, committed 65192K, reserved 1103872K\n class space used 9289K, capacity 10116K, committed 10152K, reserved 1048576K\n\n\xe2\x96\xb6 jstat -gc 32152\n S0C S1C S0U S1U …Run Code Online (Sandbox Code Playgroud) 我正在运行 JBoss 服务器,以下输出属于 -gcutil 工具。我很好奇这个缩写是什么。
Run Code Online (Sandbox Code Playgroud)/usr/java/jdk1.7.0_25/bin/jstat -gcutil 47929 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 0.00 68.46 100.00 57.08 44539 5829.704 303497 241552.104 247381.808
谢谢
我正在尝试分析远程 Java 应用程序,实际上它是一个游戏服务器。它在我的本地机器(带有 JDK1.7.0_02 x64 的 Windows XP x64)上正常工作,但在生产服务器(带有 JDK1.7.0_03 i586 的 CentOS)上表现得非常奇怪。
我做了很多搜索,发现我应该使用 VisualVM 来完成这项任务。所以 VisualVM 在本地机器上运行良好,但在本地机器上没有挂起,我需要在生产环境中使用真实有效负载进行分析。我用参数在远程机器上启动了 jstatd
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=false &
Run Code Online (Sandbox Code Playgroud)
与策略文件
grant codebase "file:/usr/java/jdk1.7.0_02/lib/tools.jar" {
permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)
然后我像这样启动了我的 Java 应用程序
java -server -Dcom.sun.management.jmxremote\
-Dcom.sun.management.jmxremote.port=4000\
-Dcom.sun.management.jmxremote.ssl=false\
-Dcom.sun.management.jmxremote.authenticate=false\
-jar /home/pinballSocketServer/pinballSocketServer.jar
Run Code Online (Sandbox Code Playgroud)
application 和 jstatd 都以 root 权限启动。
并且 VisualVM 无法连接到远程主机。但是在远程主机上,我看到以下日志,而 VisualVM 正在运行并添加了远程主机:
Feb 16, 2012 7:11:52 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:11:56 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: …Run Code Online (Sandbox Code Playgroud) 我有一个在tomcat上运行的webapp,我想在运行时使用jstat查看垃圾收集.
我有命令:
jstat.exe -gc <vmid> 1000
Run Code Online (Sandbox Code Playgroud)
我该怎么找到它vmid是什么?
我想使用gc实用程序来分析我的Cassandra数据库的垃圾回收。但是当我运行jstat命令时,输出结果是找不到bash:jstat:命令。我搜索发现jstat位于$ JAVA_HOME / bin中,但我不知道$ JAVA_HOME / bin在哪里。我想知道如何开始使用jstat?
突然间我发现这jstat 是不赞成的:
jstat工具显示已检测的HotSpot Java虚拟机(JVM)的性能统计信息.目标JVM由其虚拟机标识符或下面描述的vmid选项标识.
注意:此实用程序不受支持,可能在J2SE SDK的未来版本中不可用.它目前在Windows 98和Windows ME平台上不可用.
我在Windows上没有开发任何东西多年,但问题是 - 我应该使用什么,现在哪个工具(或一组工具)被认为是我可以使用的那种监控的最佳替代品jstat?
更新:最好使用纯CLI工具.
我正在运行jstat -gc(来自OpenJDK):
# jstat -gc 1
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
287744.0 290304.0 88368.6 0.0 1469440.0 787186.5 2162176.0 1805969.7 945432.0 923880.4 136576.0 133284.0 268 32.797 21 30.089 62.886
Run Code Online (Sandbox Code Playgroud)
如何阅读:
用过的堆
堆大小
最大堆
从这个输出,就像VisualVM所示?