标签: jvmti

Java:你如何使用JVMTI的ForceGargabeCollection强制GC?

我不是在寻找通常的"你只能使用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吗?

任何完整和可编辑的例子都是最受欢迎的.

java garbage-collection jvmti

23
推荐指数
2
解决办法
5346
查看次数

JVMTI之上的Java API?

是否有一个很好的Java API我可以在JVMTI之上使用?

java jvmti

15
推荐指数
2
解决办法
4926
查看次数

Java JVMTI与-Xdebug -Xrunjdwp不兼容

我花了最后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不是有效的设置?

java debugging jdwp jvmti

12
推荐指数
1
解决办法
1万
查看次数

AttachNotSupportedException由于Attach API中缺少java_pid文件

构建我自己的探查器,我使用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)

java jvmti

12
推荐指数
1
解决办法
2万
查看次数

notifyAll()分析时调用的数量差异

我实现了一个简单的探查与JVMTI显示的调用wait()notifyAll().作为测试用例我正在使用.Oracle的生产者消费者示例.我有以下三个事件:

  • 调用notifyAll()
  • 调用wait()
  • 等待()离开

wait()调用其离开时,它通过使用事件异形MonitorEnterMonitorExit.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)

java multithreading profiling jvmti

11
推荐指数
1
解决办法
346
查看次数

在运行时卸载JVMTI代理?

我正在使用attach API在运行时加载JVMTI代理.我想在程序完成时卸载JVMTI代理而不终止加载代理的JVM.根据此文档,无法通过attach API执行此操作.是否有其他方法可以强制代理通过Java API或JVMTI代理程序卸载其自身?

java jvmti

10
推荐指数
1
解决办法
2106
查看次数

如何使用没有进一步调用的JVMTI代理重新转换执行方法?

我正在运行时为各种目的检测类文件.我正在使用JVMTI代理.我测试方法的策略是调用RetransformClasses函数来调用ClassFileLoadHook.此策略适用于在检测时间之后进一步调用的所有方法,因为实际检测在后续函数调用中发生,但它不适用于任何没有进一步调用的方法,如main程序中的函数.

我想在执行过程中即时检测方法.我想要一些程序,如检测代码的堆栈替换(OSR).在JVMTI或任何其他方法中是否有任何策略?

PS:如果能有所帮助,我愿意编辑/修补OpenJDK源代码.

java instrumentation jit jvm-hotspot jvmti

9
推荐指数
1
解决办法
340
查看次数

我可以通过编程方式找出实例生成的GC生成吗?

此问题的范围仅限于HotSpot代.有没有办法以编程方式找出特定实例所在的生成.数据如:

  • 年轻还是老一代?
  • 如果年轻,哪个幸存者空间?
  • 里面的TLAB?哪个帖子?

任何技术(例如,BTrace,JVMTI)都可以工作,只要我可以这样做:

Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);
Run Code Online (Sandbox Code Playgroud)

乞丐不能挑肥拣瘦,但最好我也能学到当目标实例正在从一代转移到另一个在它发生的那一刻(即事件回调基础-在时延和轮询开销隐含不感兴趣)

对没有理由的只是说"不"的答案不感兴趣:)

java garbage-collection jvm jvm-hotspot jvmti

8
推荐指数
1
解决办法
602
查看次数

DebuggerStepThrough等效于Java

.NET有一些方便的注释,指示调试器逐步执行某些方法.我想知道是否有一个可以在Java平台上运行的等价物.

例如:

@DebuggerStepThrough
public void foo() {
  ..
}
Run Code Online (Sandbox Code Playgroud)

会导致调试器在步进时不会停止foo.

我尝试了什么

  • 在类文件中使用SYNTHETIC标志.这导致javac禁止用户代码调用此类方法.
  • 自定义属性.没有JDI API来检索注释.在这个论坛上也提到过.

PS.我正在实现一个调试器并控制发出的字节码

java debugging jdi jvmti

8
推荐指数
1
解决办法
165
查看次数

有没有办法使用JVMTI生成定期java线程转储?

有多种方法可以在java中生成线程转储.

我想使用JVMTI(C API)来生成它,以评估其对正在运行的JVM的性能影响.(我知道jstack和JMX;这个问题一般不是关于获取线程转储,而是关于使用JVMTI API).

我的代码是基于这篇博文.在那里,java代理附加到SIGQUIT信号.我想避免这种情况,因为这与JVM用于将线程转储写入stdout的信号相同.我想避免这种两面性.

换句话说,我想要附加一个不同的信号,或者找到一种让代理定期生成线程转储的方法.

java thread-dump jvmti

8
推荐指数
1
解决办法
1061
查看次数