我试图通过设置-XX:+DisableAttachMechanism来保护正在运行的JVM中的类。
然而,我发现这个过程阻止了像jconsole这样的工具附加,但我仍然可以使用以下命令转储JVM中所有加载的类:
java -Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=com.xxxx -classpath ".:./bin:$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.tools.jcore.ClassDump 1234
有没有办法通过在运行的JVM中设置一些选项来停止这种行为?或者其他什么工作?
谢谢
2条答案
按热度按时间rbl8hiat1#
一般来说,这是不可能的。
Serviceability Agent(sa-jdi)不需要来自目标进程的协作。它只是使用ptrace syscall停止目标JVM,并在JVM甚至不知道的情况下读取进程的内存。
但是,通过覆盖Serviceability Agent使用的变量,可以使调试更加困难。特别是,如果重置
gHotSpotVMStructs
全局变量,SA将无法重建内部VM结构,因此基于SA的工具将停止工作。为此,请编译以下
novmstructs.c
程序:如何编译:
然后运行Java应用程序,并将生成的库附加为代理:
下次有人尝试调用ClassDump或其他基于SA的实用程序时,将发生异常:
iq0todco2#
老问题了但我们开始了
jvmArguments
将拥有启动jvm的所有参数,你可以在加载实际的类之前检查这些参数,如果使用了一个标志,你不想中止加载。但请记住,这只是从jvm转储类的许多方法之一,你可以附加一个代理,钩子ClassLoader#defineClass和许多其他东西,只要你在jvm中,就没有办法100%“转储证明”。