我不是在寻找通常的"你只能使用System.gc()来回答Java中的GC ",这个问题根本不是什么.
我的问题不是主观的,而是基于现实:GC 可以用Java来强制实现.我们每天使用的许多程序都是这样做的:IntelliJ IDEA,NetBeans,VisualVM.
它们都可以强制 GC发生.
怎么做?
我认为他们都使用JVMTI,更具体地说是ForceGarbageCollection(注意"Force"),但我怎么能为自己尝试呢?
http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection
还要注意,这个问题不是关于"为什么"我想要这样做:"为什么"可能是"好奇心"或"我们正在编写类似于VisualVM的程序"等.
问题是"你如何使用JVMTI的ForceGarbageCollection强制GC"?
是否需要使用任何特殊参数启动JVM?
是否需要任何JNI?如果是这样,究竟是什么代码?
它只适用于Sun VM吗?
任何完整和可编辑的例子都是最受欢迎的.
我花了最后4个小时尝试在必须远程运行的Tomcat实例上设置Eclipse TPTP内存分析(即不在Eclipse中).根据TPTP和代理控制器文档,这应该是可能的.
我根据网站上的说明将TPTP组件(4.6.0)安装到我的Eclipse(Galileo)工作台以及代理控制器中.为了启用代理,我在启动Tomcat实例的命令行中添加了以下选项:
-agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf:allocsites=true
Run Code Online (Sandbox Code Playgroud)
并将以下目录添加到PATH的前面:
D:\dev\tools\ac\plugins\org.eclipse.tptp.javaprofiler
D:\dev\tools\ac\bin
Run Code Online (Sandbox Code Playgroud)
尝试启动Tomcat时,我始终收到以下错误消息:
ERROR: JDWP unable to get necessary JVMTI capabilities. ["debugInit.c",L279]
Run Code Online (Sandbox Code Playgroud)
我做了很多谷歌搜索,但发现没有相关性; 我尝试重新安装TPTP和各种版本的代理控制器.
最后问题结果是我用"jpda"选项启动Tomcat,catalina.bat转换为
-Xdebug -Xrunjdwp:transport=.....
Run Code Online (Sandbox Code Playgroud)
删除"jpda"命令参数导致JVMTI开始工作.
所以,问题是:我在任何搜索过程中都没有发现任何内容,表明JVMTI代理与调试不兼容.有人可以解释发生了什么以及为什么JVMTI + JDWP不是有效的设置?
构建我自己的探查器,我使用JVMTI API来构建本机库代理.可以使用add参数-agentlib与JVM一起启动此代理程序.此外还有Attach API,它允许将代理注入正在运行的JVM中.我想使用以下代码将此功能实现到我的探查器:
try {
String pid = VirtualMachine.list().get(0).id();
VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgentLibrary("agent");
} catch (AgentLoadException e1) {
e1.printStackTrace();
} catch (AgentInitializationException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (AttachNotSupportedException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
它有什么作用?从所有可用的正在运行的虚拟机(VirtualMachine.list()
)中,我选择第一个,附加到它并尝试将我的代理加载到其中.可以在UNIX系统上找到名为libagent.so的代理,但在尝试加载代理时会引发以下异常:
com.sun.tools.attach.AttachNotSupportedException:
Unable to open socket file:
target process not responding or HotSpot VM not loaded.
Run Code Online (Sandbox Code Playgroud)
查看源代码,抛出此异常,因为它找不到名为的文件.java_pid<pid>
.我没有在文档中找到有关此类文件的大量信息.我经常听说这种文件不再使用,但我正在运行Java 1.6.
我还尝试连接到其他JVM,事实上我保持这个附加过程是动态的,出于测试原因我只是尝试连接到任何JVM.
这是导致异常的代码,取自sun.tools.attach:LinuxVirtualMachine.java:
// Return the socket file for the given process.
// Checks working directory …
Run Code Online (Sandbox Code Playgroud) 我实现了一个简单的探查与JVMTI显示的调用wait()
和notifyAll()
.作为测试用例我正在使用.Oracle的生产者消费者示例.我有以下三个事件:
该wait()
调用其离开时,它通过使用事件异形MonitorEnter
和MonitorExit
.notifyAll()
当notifyAll
退出名称的方法时,将调度调用.
现在我有以下结果,第一个来自探查器本身,第二个来自Java,我已经放置了相应的System.out.println
语句.
// Profiler:
Thread-1 invoked notifyAll()
Thread-0 invoked notifyAll()
Thread-0 invoked notifyAll()
Thread-0 invoked notifyAll()
Thread-0 invoked notifyAll()
Thread-0 invoked notifyAll()
Thread-1 invoked notifyAll()
Thread-1 invoked notifyAll()
Thread-1 invoked notifyAll()
Thread-1 invoked notifyAll()
Thread-1 invoked notifyAll()
Thread-1 invoked notifyAll()
Thread-1 invoked notifyAll()
Thread-1 invoked wait()
Thread-1 left wait()
Thread-1 invoked notifyAll()
Thread-1 invoked …
Run Code Online (Sandbox Code Playgroud) 我正在使用attach API在运行时加载JVMTI代理.我想在程序完成时卸载JVMTI代理而不终止加载代理的JVM.根据此文档,无法通过attach API执行此操作.是否有其他方法可以强制代理通过Java API或JVMTI代理程序卸载其自身?
我正在运行时为各种目的检测类文件.我正在使用JVMTI代理.我测试方法的策略是调用RetransformClasses
函数来调用ClassFileLoadHook
.此策略适用于在检测时间之后进一步调用的所有方法,因为实际检测在后续函数调用中发生,但它不适用于任何没有进一步调用的方法,如main
程序中的函数.
我想在执行过程中即时检测方法.我想要一些程序,如检测代码的堆栈替换(OSR).在JVMTI或任何其他方法中是否有任何策略?
PS:如果能有所帮助,我愿意编辑/修补OpenJDK源代码.
此问题的范围仅限于HotSpot代.有没有办法以编程方式找出特定实例所在的生成.数据如:
任何技术(例如,BTrace,JVMTI)都可以工作,只要我可以这样做:
Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);
Run Code Online (Sandbox Code Playgroud)
乞丐不能挑肥拣瘦,但最好我也能学到当目标实例正在从一代转移到另一个在它发生的那一刻(即事件回调基础-在时延和轮询开销隐含不感兴趣)
对没有理由的只是说"不"的答案不感兴趣:)
.NET有一些方便的注释,指示调试器逐步执行某些方法.我想知道是否有一个可以在Java平台上运行的等价物.
例如:
@DebuggerStepThrough
public void foo() {
..
}
Run Code Online (Sandbox Code Playgroud)
会导致调试器在步进时不会停止foo
.
PS.我正在实现一个调试器并控制发出的字节码
java ×10
jvmti ×10
debugging ×2
jvm-hotspot ×2
jdi ×1
jdwp ×1
jit ×1
jvm ×1
profiling ×1
thread-dump ×1