Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有JDK的情况下运行jcmd?_Java_Jmap - Fatal编程技术网

Java 如何在没有JDK的情况下运行jcmd?

Java 如何在没有JDK的情况下运行jcmd?,java,jmap,Java,Jmap,我试图找出如何在安装在客户端站点的windows服务器上删除jcmd.exe,以便解决堆和线程问题。我真的不想安装完整的JDK,因为它会使环境复杂化 jcmd.exe肯定希望JDK中的一些组件能够运行,但我无法确定是哪些组件。如果我能把它压缩到一个小文件夹中,用它来捕获数据,然后销毁,那就太完美了 有人知道jcmd需要运行哪些JDK组件吗?快速查看jcmd.exe会发现: ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7fff01820

我试图找出如何在安装在客户端站点的windows服务器上删除jcmd.exe,以便解决堆和线程问题。我真的不想安装完整的JDK,因为它会使环境复杂化

jcmd.exe肯定希望JDK中的一些组件能够运行,但我无法确定是哪些组件。如果我能把它压缩到一个小文件夹中,用它来捕获数据,然后销毁,那就太完美了


有人知道jcmd需要运行哪些JDK组件吗?

快速查看jcmd.exe会发现:

    ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7fff01820000)
    KERNEL32.DLL => /c/WINDOWS/system32/KERNEL32.DLL (0x7ffeff180000)
    KERNELBASE.dll => /c/WINDOWS/system32/KERNELBASE.dll (0x7ffefe810000)
    SYSFER.DLL => /c/WINDOWS/System32/SYSFER.DLL (0x54f10000)
    jli.dll => /c/apps/jdk1.8.0_121/bin/jli.dll (0x51ec0000)
    MSVCR100.dll => /c/apps/jdk1.8.0_121/bin/MSVCR100.dll (0x51c40000)
    ADVAPI32.dll => /c/WINDOWS/system32/ADVAPI32.dll (0x7ffefeeb0000)
    msvcrt.dll => /c/WINDOWS/system32/msvcrt.dll (0x7fff01720000)
    sechost.dll => /c/WINDOWS/system32/sechost.dll (0x7ffeff0c0000)
    RPCRT4.dll => /c/WINDOWS/system32/RPCRT4.dll (0x7ffefec20000)
    USER32.dll => /c/WINDOWS/system32/USER32.dll (0x7ffefef60000)
    COMCTL32.dll => /c/WINDOWS/WinSxS/amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.10586.672_none_a2d6b3cea53ff843/COMCTL32.dll (0x7ffef8460000)
    GDI32.dll => /c/WINDOWS/system32/GDI32.dll (0x7ffeff230000)
    combase.dll => /c/WINDOWS/system32/combase.dll (0x7ffeff3c0000)
    bcryptPrimitives.dll => /c/WINDOWS/system32/bcryptPrimitives.dll (0x7ffefe540000)
因此,msvcr100.dll和jli.dll似乎是JDK中唯一必需的组件。一个超级快速的测试似乎表明这三个文件就足够了,但我承认我的测试情况可能并不完美

编辑:经过进一步的检查,这里是我发现可以工作的最低配置。可以稍微修改目录结构,并设置类路径、JAVA_HOME和PATH等内容。我没有探究所有的排列

.:
bin/  COPYRIGHT*  jre/  lib/  LICENSE*

./bin:
jcmd.exe*  jli.dll*  msvcr100.dll*

./jre:
bin/  COPYRIGHT*  lib/  LICENSE*

./jre/bin:
attach.dll*  java.dll*  jli.dll*  net.dll*  nio.dll*  server/  unpack.dll*  
verify.dll*  zip.dll*

./jre/bin/server:
classes.jsa*  jvm.dll*  Xusage.txt*

./jre/lib:
amd64/  rt.jar*

./jre/lib/amd64:
jvm.cfg*

./lib:
jvm.lib*  tools.jar*
我还留下了版权和许可文件,因为我觉得它们很重要

测试:

bin\jcmd.exe 16696 Thread.print
16696:
2017-04-27 18:01:49
全线程转储Java热点(TM)64位服务器VM(25.121-b13混合模式):
“Worker-32”#84优先级=5 os_优先级=0 tid=0x000000001bcaf800 nid=0x416c in
Object.wait()[0x00000000335ef000]
java.lang.Thread.State:定时等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
位于org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
-锁定(org.eclipse.core.internal.jobs.WorkerPool)
位于org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
位于org.eclipse.core.internal.jobs.Worker.run(Worker.java:52)
“Worker-31”#83优先级=5 os_优先级=0 tid=0x000000001bcb7800 nid=0x315c in
Object.wait()[0x00000000312ef000]
java.lang.Thread.State:定时等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
位于org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
-锁定(org.eclipse.core.internal.jobs.WorkerPool)
位于org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
位于org.eclipse.core.internal.jobs.Worker.run(Worker.java:52)
...
F:\tmp\t1>bin\jcmd 16696 VM.flags
16696:
-XX:CICompilerCount=4-XX:InitialHeapSize=268435456
-XX:MaxHeapSize=1073741824-XX:MaxNewSize=357564416
-XX:MinHeapDeltaBytes=524288-XX:NewSize=89128960-XX:OldSize=179306496
-XX:+UseCompressedClassPointers-XX:+UseCompressedDoops
-XX:+UseFastUnorderedTimeStamps-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC

快速检查jcmd.exe会发现:

    ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7fff01820000)
    KERNEL32.DLL => /c/WINDOWS/system32/KERNEL32.DLL (0x7ffeff180000)
    KERNELBASE.dll => /c/WINDOWS/system32/KERNELBASE.dll (0x7ffefe810000)
    SYSFER.DLL => /c/WINDOWS/System32/SYSFER.DLL (0x54f10000)
    jli.dll => /c/apps/jdk1.8.0_121/bin/jli.dll (0x51ec0000)
    MSVCR100.dll => /c/apps/jdk1.8.0_121/bin/MSVCR100.dll (0x51c40000)
    ADVAPI32.dll => /c/WINDOWS/system32/ADVAPI32.dll (0x7ffefeeb0000)
    msvcrt.dll => /c/WINDOWS/system32/msvcrt.dll (0x7fff01720000)
    sechost.dll => /c/WINDOWS/system32/sechost.dll (0x7ffeff0c0000)
    RPCRT4.dll => /c/WINDOWS/system32/RPCRT4.dll (0x7ffefec20000)
    USER32.dll => /c/WINDOWS/system32/USER32.dll (0x7ffefef60000)
    COMCTL32.dll => /c/WINDOWS/WinSxS/amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.10586.672_none_a2d6b3cea53ff843/COMCTL32.dll (0x7ffef8460000)
    GDI32.dll => /c/WINDOWS/system32/GDI32.dll (0x7ffeff230000)
    combase.dll => /c/WINDOWS/system32/combase.dll (0x7ffeff3c0000)
    bcryptPrimitives.dll => /c/WINDOWS/system32/bcryptPrimitives.dll (0x7ffefe540000)
因此,msvcr100.dll和jli.dll似乎是JDK中唯一必需的组件。一个超级快速的测试似乎表明这三个文件就足够了,但我承认我的测试情况可能并不完美

编辑:经过进一步的检查,这里是我发现可以工作的最低配置。可以稍微修改目录结构,并设置类路径、JAVA_HOME和PATH等内容。我没有探究所有的排列

.:
bin/  COPYRIGHT*  jre/  lib/  LICENSE*

./bin:
jcmd.exe*  jli.dll*  msvcr100.dll*

./jre:
bin/  COPYRIGHT*  lib/  LICENSE*

./jre/bin:
attach.dll*  java.dll*  jli.dll*  net.dll*  nio.dll*  server/  unpack.dll*  
verify.dll*  zip.dll*

./jre/bin/server:
classes.jsa*  jvm.dll*  Xusage.txt*

./jre/lib:
amd64/  rt.jar*

./jre/lib/amd64:
jvm.cfg*

./lib:
jvm.lib*  tools.jar*
我还留下了版权和许可文件,因为我觉得它们很重要

测试:

bin\jcmd.exe 16696 Thread.print
16696:
2017-04-27 18:01:49
全线程转储Java热点(TM)64位服务器VM(25.121-b13混合模式):
“Worker-32”#84优先级=5 os_优先级=0 tid=0x000000001bcaf800 nid=0x416c in
Object.wait()[0x00000000335ef000]
java.lang.Thread.State:定时等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
位于org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
-锁定(org.eclipse.core.internal.jobs.WorkerPool)
位于org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
位于org.eclipse.core.internal.jobs.Worker.run(Worker.java:52)
“Worker-31”#83优先级=5 os_优先级=0 tid=0x000000001bcb7800 nid=0x315c in
Object.wait()[0x00000000312ef000]
java.lang.Thread.State:定时等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
位于org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
-锁定(org.eclipse.core.internal.jobs.WorkerPool)
位于org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
位于org.eclipse.core.internal.jobs.Worker.run(Worker.java:52)
...
F:\tmp\t1>bin\jcmd 16696 VM.flags
16696:
-XX:CICompilerCount=4-XX:InitialHeapSize=268435456
-XX:MaxHeapSize=1073741824-XX:MaxNewSize=357564416
-XX:MinHeapDeltaBytes=524288-XX:NewSize=89128960-XX:OldSize=179306496
-XX:+UseCompressedClassPointers-XX:+UseCompressedDoops
-XX:+UseFastUnorderedTimeStamps-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC

我也在寻找一种使用JRE(在生产环境中)运行jcmd的方法。 我无法使用@KevinO的其他现有答案,因为我运行的是K8S,我的docker映像基于Alpine Linux

最终,我将JDK中的最小工件复制到docker映像中,并能够运行jcmd和启动Flight Recorder。 我使用的是Azul JRE zulu11.41.24-sa-jre11.0.8-linux_musl_x64

以下是对我有用的内容(来自dockerfile的片段):


我还在寻找一种使用JRE(在生产环境中)运行jcmd的方法。 我无法使用@KevinO的其他现有答案,因为我运行的是K8S,我的docker映像基于Alpine Linux

最终,我将JDK中的最小工件复制到docker映像中,并能够运行jcmd和启动Flight Recorder。 我使用的是Azul JRE zulu11.41.24-sa-jre11.0.8-linux_musl_x64

以下是对我有用的内容(来自dockerfile的片段):


jcmd工具是用Java编写的,因此需要JDK

在JDK 9或更高版本中,您可以使用jlink创建自定义JDK映像,该映像只包含jcmd工具所需的模块。

$ cd %JAVA_HOME% $ bin\jlink --module-path jmods --add-modules jdk.jcmd --output c:\custom-jdk $ c:\custom-jdk\bin $ jcmd
FROM adoptopenjdk/openjdk11-openj9:slim as base
ENV    JCMD=/tmp/jcmd
RUN  jlink --module-path jmods --add-modules jdk.jcmd --output ${JCMD}

FROM debian:stretch-slim
COPY --from=base /tmp/jcmd /tmp/jcmd
ENV PATH="/tmp/jcmd/bin:${PATH}"