标签: yourkit

哪个Java Profiler更好:JProfiler或YourKit?

哪种分析器更适合通用分析和堆分析?我们90%的应用程序都是独立的命令行程序,具有大量的数据库和数字处理功能.另外10%是webapps/servlet容器应用程序(JSP和NO SCRIPLETS很少!).目标用户将是具有5 - 10年行业经验的高级软件工程师.我们只需要Sun JDK 5和.

截至撰写此问题(2008-10-02)时,JProfiler为5.1.4,YourKit为7.5.看起来像YourKit 8.0即将发布.

java performance jprofiler yourkit

59
推荐指数
8
解决办法
5万
查看次数

有没有办法分析截断的Java堆转储(hprof文件)?

在我的工作中,我们遇到了难以重现的OOM问题.或者,更准确地说,它很容易在一个系统上重现,使得该系统无法使用,但在相同的输入下难以在其他任何地方重现.

应用程序使用服务包装器作为服务运行.我们确实设法更改配置以启动它,并选择在OOM上输出堆转储文件,但不幸的是,它们被截断,很可能是由于服务包装器超时并在写入文件时终止进程.这很明显,因为最大内存设置为1GB,而hprof文件小到700MB,这对于OOM上的整个堆来说太小了.

需要花费大量资金来进一步配置包装器以使java进程有更长的时间来写出堆,但我们正在使用这两个选项来实现这一点:

wrapper.jvm_exit.timeout=600
wrapper.shutdown.timeout=600
Run Code Online (Sandbox Code Playgroud)

问题是,我能用截断的hprof文件做些什么有用吗?Eclipse MAT扼杀它们.Jhat似乎加载了它们,但随后只显示了3个大小为0的Java.Object实例.我试过YourKit,它无法写出它的oids文件.

在我看来,这些文件应该包含一些有用的,可访问的信息.有没有一个工具可以读取那里有什么?

感谢您的时间!

java jhat yourkit hprof eclipse-memory-analyzer

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

分析由JNI调用运行的Java

我有一个执行时的C++代码:

加载JVM(我完全控制如何加载JVM),并使用C JNI代码调用Java方法(来自加载的类).Java代码没有Main(),它实际上不是标准的Java应用程序.它主要是一个编译并压缩成Jar文件的静态代码,代码由C++模块调用.

是否可以分析由YourKit执行的Java代码(拥有许可证)?如果是这样,我会很高兴知道如何.

java java-native-interface profiling yourkit

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

我可以从实时JVM转储当前线程堆栈变量吗?

我需要查看2个死锁线程的堆栈来分析情况.现在JVM是现场直播,数据就在那里,但是我需要某种工具来从流程中提取它.我只关心类型堆栈中的6个变量String.任何想法都非常感谢.JVM版本6_35,它是a linux,JMX已启用,但我没有profiler/debugger配置连接.重现起来非常困难.

java jvm yourkit stack-trace jvm-crash

10
推荐指数
2
解决办法
2196
查看次数

什么会导致Tomcat(v8)具有周期性规律性的CPU峰值

在Windows 2012 RT(x64)TEST服务器上,我们正在运行Tomcat 8安装,并且CPU使用率在达到峰值使用率的常规性方面令人不安.

安装我们的应用程序后,但任何人访问它之前,会发生这种情况.我已经访问了几个页面并测试了一些功能,但没有任何可以创建我所知道的这种行为.

服务器上有2个虚拟处理器,每隔约20秒,CPU使用率将在一个处理Tomcat的处理器上达到100%,持续10秒(给予或接受).见下文:

周期性峰值图

模式的规律性向我表明在Tomcat 8的安装或设置中有些不正确.

我已经安装了YourKit Java Profiler(通过SO推荐),我希望能够解释导致这些峰值的原因,但是还没有看到线程启动的原因 - 至少部分是因为我的新意到YourKit.我确实将它附加到Tomcat启动文件,它似乎跟踪行为.

catalina日志在加标事件期间是静默的(就像我的应用程序日志一样)但是当我停止Tomcat时,有一些关于ThreadLocals的消息开始但无法删除然后:"...线程将随着时间的推移而更新尽量避免可能的内存泄漏."

我让服务器在周末运行,模式一直持续到今天,所以我不认为我的症状会消失.无论启动什么,现在只需每20秒启动一次这些线程(和/或YourKit)消耗系统上所有可用的RAM .

什么是可能的方法来隔离这种异常的Tomcat活动,并希望停止或纠正它?

YourKit中有许多图表和标签,因此我不愿列出可能有用的所有内容.感谢您帮助我缩小了YourKit(或其他工具)可以为我提供的问题.

来自catalina日志的关于启动的信息:

Apache Tomcat/8.0.23
Architecture: amd64
Java Home: C:\Program Files\Java\jre1.8.0_65
CATALINA_BASE: C:\Program Files\Apache Software Foundation\Tomcat 8.0
Run Code Online (Sandbox Code Playgroud)

2015-12-08更新

在Gergely的请求下,该应用程序是DSpace的本地安装.它是一个带有Postgres SQL数据库后端的Java应用程序.我们从这里定制一个开源版本:http://www.dspace.org/introducing.我不确定还有什么可以提供帮助,我认为堆栈跟踪更多地揭示了什么是(并且没有)运行 - 见下文.

通过启用YourKit中的Stack Telemetry,可以通过将光标拖过一段Profiler历史记录来获得"CPU Estimation".对我来说,看起来所有CPU正在做的就是空转.Java文件是否在Tomcat例程下面如图?他们没有像DSpace那样打击我(尽管我不是专家)也不会看起来在CPU达到峰值时正在完成任何工作.

值得注意的是:在静默期间堆栈跟踪是相同的 - 唯一的区别是CPU时间(ms)是数百而不是数千毫秒.为了比下面的更直接的比较,hump在Thread.run()中表示~8,000ms,而静默期消耗~125ms的cpu时间(尽管覆盖大约相同的时间量).

最后,当请求应用程序的页面时,后续的代码分支出现在调用树中.如果它发生在尖峰期间,则可能只需要400毫秒的CPU时间来加载整页.出现的代码分支是ApplicationFilterChain.java,作为整个单独的分支以及PooledExecutor $ Worker.run() - 在层次结构中的java.lang.Thread.run()下面.

当试图解释堆栈跟踪时:EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run()负责吗?

处理器峰值没有已知的相关活动

CPU分析

2015-12-08更新#2

YourKit预先配置为隐藏某些java类名称模式,这些模式模糊了java.lang.Thread上的向下钻取.清除过滤器启用以下屏幕截图,显示峰值事件期间的绝大多数处理时间是通过调用以下3种方法:

  • java.io.WinNTFileSystem.canonicalize0
  • java.io.WinNTFileSystem.getBooleanAttributes(inFile.exists())
  • StardardRoot.java

我很抱歉还不了解Tomcat或DSpace以了解谁正在启动这些任务.(如果重要的是第一行正上方的那条线java.lang.Thread.run()然后 …

performance tomcat yourkit dspace windows2012

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

是否可以在外部分析器下运行 JMH 基准测试?

我目前正在寻找性能。为了衡量吞吐量,并确保我们不会倒退,我使用了很棒的 JMH。

当我遇到的东西是,虽然慢,我要开始剖析,看看是怎么回事,根据这个链接江铃控股的作者写道:

虽然 JMH 分析器可以帮助分析,但我认为它们不能替代正确的分析。例如,“堆栈”分析器很适合浏览配置文件,但不适用于严肃的工作。

更长时间地运行工作负载,并将您选择的分析器附加到正在运行的 VM。

我暗中希望我可以从命令行调整 JMH 测试,然后将诸如visualvm 之类的东西附加到它上面……但到目前为止我已经能够让它工作了。我想这是个坏主意?如果我可以共享我用来分析的代码以及我用来强制执行的代码,那将是理想的。

java visualvm yourkit performance-testing jmh

9
推荐指数
2
解决办法
2239
查看次数

为什么park/unpark有60%的CPU使用率?

最近我们开始使用YJP 11.0.9对我们的应用程序(基于XMPP的聊天服务器)进行压力测试.在我们的测试期间,我们发现了以下奇怪

  1. 采样显示sun.misc.Unsafe.unpark(Object)占用了60%的CPU.
  2. 对于同一个应用程序跟踪显示LockSupport.park(Object)占用了52%的CPU.

我做了多次测试来确认结果,每次我得到类似的结果.

我无法理解为什么unpark应该花费60%的时间以及为什么跟踪显示完全相反的结果.

有人可以帮助我理解这些结果.我在这里错过了什么吗?

环境:

java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

java profiling yourkit

6
推荐指数
2
解决办法
4386
查看次数

即使没有gc root,WebappClassLoader内存也会泄漏

这是HEAD DUMP(2013年10月29日更新)

我正在使用webapp工作:

  • Tomcat 7.0.24
  • Java 6
  • 春天3(与aop - cglib)
  • Log4j上的SLF4J
  • Oracle Coherence

经过大量的工作,我设法删除了对类加载器的所有强引用,现在它是垃圾收集器的候选者.那么,内存泄漏解决了吗?当然不是!因为在几次热部署之后,由于PermGen空间而出现了OOME.

感谢Yourkit,我能够检查是否WebappClassLoaderPending Finalization,这意味着它正在终结队列中等待(实际上,不是WebappClassLoader自己而是他的指示对象之一).检查内存快照我发现了几个Finalizer对Oracle Coherence类的引用...... 在此输入图像描述

这似乎是"okey":Coherence对象正在等待垃圾收集,这要归功于删除所有强引用(删除所有一致性线程,删除java安全提供程序等)所做的所有艰苦工作.我想这里没什么可做的.

所以,我正在考虑一些finalize破坏某些东西然后不允许清空终结器队列的执行.但奇怪的是,使用JMX或jmap -finalizerinfo终结器队列似乎是空的!这一切都很混乱所以我一直在其他地方搜索......

你认为这是可以做的吗?我读过一些关于CGLIB增强finalize方法的内容.如果我有权访问,Enhancer我可以创建一个回调过滤器,如下所述,但我不知道如何使用Spring AOP来管理它.

好吧,在其他地方搜索,我发现了几个弱引用java.lang.reflect.Proxy.这些是jdk动态代理吗?或者它们与Introspection内存泄漏有关?弱参考?

在此输入图像描述

信息:我正在使用Spring的上下文监听器来刷新instrospector的缓存(java.beans.Introspector.flushCaches()).我还能做些什么呢?

让我们继续.

然后,我们还有其他几个弱引用java.io.ObjectStreamClass$Caches.我的很多业务对象都有这些弱引用.

在此输入图像描述 在此输入图像描述

也许我需要刷新这些缓存.但是怎么样?

然后我们有这些与之相关的弱参考com.sun.internal.ResourceManager,java.util.logging.Loggingjava.lang.reflect.Proxy

在此输入图像描述

我可以用这个弱引用做什么?我是否需要担心这个问题,或者问题出现在终结器队列中?任何线索都会有所帮助......真的:-D

Ah, another thing, I found a weak reference from a tomcat "main" thread that will …

java tomcat memory-leaks yourkit classloader

6
推荐指数
1
解决办法
4204
查看次数

YourKit-对象的保留大小不等于其引用的所有对象的保留大小

对象的保留大小不等于其引用的所有对象的保留大小。

这是正在发生的事情:

  1. 使用YourKit捕获内存快照。
  2. 单击对象并按类类型显示实例
  3. 假设实例的保留内存为A字节(600mb)
  4. 扩展并求和基础实例的保留大小,假设总和为B(300mb)

A >> B

java memory-management yourkit performance-testing

6
推荐指数
1
解决办法
690
查看次数

为什么我的堆主要由无法访问的对象组成?

我只是在 YourKit 分析器中查看了我的堆转储,并看到了以下可达/不可达统计信息。

在此处输入图片说明

我不太确定这一点。这是否意味着我的几乎所有堆都包含一些垃圾数据,我需要强烈调整我的 G1。或者这是通常的统计数据?

问题:GC 时间大约是应用程序运行时间的 10%。

我对无法访问的对象是可以被垃圾收集的对象的理解是否正确,或者 YourKit 的含义有所不同?这是一段 GC 日志(使用 CMS):

2.823: [GC (Metadata GC Threshold) [PSYoungGen: 420257K->52400K(564736K)] 420257K->52488K(1854976K), 0.0607756 secs] [Times: user=0.18 sys=0.01, real=0.06 secs] 
2.884: [Full GC (Metadata GC Threshold) [PSYoungGen: 52400K->0K(564736K)] [ParOldGen: 88K->51480K(903680K)] 52488K->51480K(1468416K), [Metaspace: 20809K->20809K(1067008K)], 0.1990115 secs] [Times: user=0.59 sys=0.01, real=0.20 secs] 
5.760: [GC (Metadata GC Threshold) [PSYoungGen: 287353K->65545K(664576K)] 338833K->117033K(1568256K), 0.0571198 secs] [Times: user=0.13 sys=0.02, real=0.06 secs] 
5.818: [Full GC (Metadata GC Threshold) [PSYoungGen: 65545K->0K(664576K)] [ParOldGen: 51488K->103745K(1605120K)] 117033K->103745K(2269696K), [Metaspace: 34820K->34772K(1079296K)], 0.1841317 secs] …
Run Code Online (Sandbox Code Playgroud)

java heap yourkit

6
推荐指数
1
解决办法
615
查看次数