java - Eclipse 巨大的 CPU 峰值

标签 java eclipse performance jvm jvisualvm

我正在拼命寻找由于 CPU 峰值(18-19 个核心,100% 负载)导致的 Eclipse 卡住瞬间(最多 2-3 秒)的问题。在峰值期间什么都不起作用,整个 eclipse 只是没有反应。 自从我修改了 eclipse.ini 以使用适当的堆大小和垃圾收集器后,生活变得更好了。尽管如此,卡住仍然存在。我已经使用jvisualvm来排除垃圾收集器。正如您在下面的屏幕上看到的,CPU 峰值和堆大小之间不存在依赖关系。

您能否告诉我如何使用 jvisualvm 或任何其他适用于 Linux 的工具来识别问题(CPU 峰值)?

<小时/>

技术细节:

$ java -version
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu0.12.04.1)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

Spikes in CPU

$ cat /opt/eclipse/eclipse.ini
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.200.v20140116-2212
-showsplash org.eclipse.platform
--launcher.defaultAction openFile
--launcher.appendVmargs
-vmargs
-Xss2M
-Xms3G
-server
-XX:MaxPermSize=2048M

-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
-XX:G1HeapWastePercent=5
-XX:InitiatingHeapOccupancyPercent=83
-XX:MaxGCPauseMillis=500
<小时/>

完整线程转储 here

最可疑的线程:

  "RJHelper [Thread-1]" daemon prio=10 tid=0x00007fe128009000 nid=0xe37a waiting for monitor entry [0x00007fe13f5f9000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:172)
    - locked <0x00000003a4539c40> (a java.util.ArrayList)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy16.runAsync(Unknown Source)
    at de.walware.rj.server.client.AbstractRJComClient.runAsyncPing(AbstractRJComClient.java:754)
    at de.walware.rj.server.client.AbstractRJComClient$KeepAliveRunnable.run(AbstractRJComClient.java:178)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - <0x000000039a4ee240> (a java.util.concurrent.ThreadPoolExecutor$Worker)

最佳答案

Jvisualvm 还支持线程转储,甚至支持基于线程转储的分析,这应该可以帮助您快速识别正在发生的情况。

关于java - Eclipse 巨大的 CPU 峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587382/

相关文章:

java - 同时根据两个参数进行集合排序

java - Maven/Eclipse 与 Vagrant

java - 如何详细计算这段代码的时间复杂度大O?

java - 带有可关闭参数的 try-with-resources 的行为

java - 如何在Java Applet中获取Richtext Box?

java - 改善 JBoss 5 慢启动

javascript - 如何使用 JQuery 高效地 append 内容

java - 如何打开特定java进程的控制台

java - Eclipse:警告:[选项]引导类路径未与-source 1.6一起设置

css - 使用多/双/条件 CSS 选择器时的性能如何?例如.hello1.hellob