我们在生产环境中安装了JRE,但没有安装JDK。 JRE和OS的版本如下。
[me@mymachine ~]$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
[me@mymachine ~]$ uname -a
Linux mymachine.mydomain.com 3.10.35-43.137.amzn1.x86_64 #1 SMP Wed Apr 2 09:36:59 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
似乎“jmap”工具不存在于系统的任何位置,并且没有root访问权限,我无法在任何系统位置安装它。我该怎么做才能获得堆转储(即生成.hprof文件)?
另外,如果重要的话,我们正在使用JBoss 7.1.3.AS。
答案 0 :(得分:7)
jmap
,jconsole
和jvisualvm
等内置工具仅在JDK中可用。另一个选择是添加VM参数-XX:+HeapDumpOnOutOfMemoryError
,它告诉JVM在发生OutOfMemoryError时自动生成堆转储,并使用参数-XX:HeapDumpPath
来指定堆转储的路径。
如果您无法升级JRE以使用服务器JRE 7(http://www.oracle.com/technetwork/java/javase/downloads/server-jre7-downloads-1931105.html)中的工具,则可能需要考虑第三方分析工具,如JProfiler或列表{{3 }}
答案 1 :(得分:3)
使用jattach,这是由JVM黑客Andrei Pangin创建的工具。它很小(24KB),仅可与JRE一起使用,并支持Linux容器。
jattach PID-OF-JAVA dumpheap <path to heap dump file>
答案 2 :(得分:0)
唯一的方法似乎是将本地SDK6压缩并将其放在服务器上的某个位置。然后打开一个远程控制台,并从该SDK的bin目录中转储JRE。
如果您的客户禁止上传可执行文件,那么您当然不走运。
答案 3 :(得分:0)
kill -3 <pid>
线程转储将发送到
或在下面使用组合:
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=~/jvm.log
如果要重定向。,但是为此,您必须通过命令行运行进程。