Tag: 分析

Java分析 – 如何通过方法分析我的应用程序获取方法?

我想运行我的Java应用程序,并且对于给定的工作负载能够看到: 调用给定函数的次数 相对而言每个函数调用的成本是多少(即每个函数执行需要多长时间) 我大致知道瓶颈在我的应用中的位置,但我需要更细粒度的视图以缩小它的范围。 谢谢 编辑 jvisualvm看起来像工具 – 它在大约30秒内识别出问题。 我只需要知道“自我时间”在方法配置文件的上下文中意味着什么。 谢谢

DecimalFormat.format()的更快替代方案?

为了提高性能,我使用VisualVM采样器分析了我的一个应用程序,使用的最小采样周期为20ms。 根据分析器,主线程在DecimalFormat.format()方法中花费了近四分之一的CPU时间。 我使用带有0.000000模式的DecimalFormat.format()将double数字“转换”为具有正好六位小数的字符串表示。 我知道这种方法相对昂贵并且被称为很多次,但我仍然对这些结果感到有些惊讶。 这种采样分析仪的结果在多大程度上准确? 我将如何validation它们 – 最好不要求助于仪器分析仪? 对于我的用例,是否有更快的替代DecimalFormat ? 推出自己的NumberFormat子类是否有意义? 更新: 我创建了一个微基准来比较以下三种方法的性能: DecimalFormat.format() :单个DecimalFormat对象重复使用多次。 String.format() :多个独立调用。 在内部,这种方法归结为 public static String format(String format, Object … args) { return new Formatter().format(format, args).toString(); } 因此我期望它的性能与Formatter.format()非常相似。 Formatter.format() :单个Formatter对象重复使用多次。 此方法稍微不方便 – 使用默认构造函数创建的Formatter对象将format()方法创建的所有字符串追加到内部StringBuilder对象,该对象无法正确访问,因此无法清除。 因此,对format()多次调用将创建所有结果字符串的串联 。 为了解决这个问题,我提供了自己的StringBuilder实例,我在使用之前通过setLength(0)调用清除了该实例。 结果有趣: DecimalFormat.format()是每次调用1.4us的基线。 String.format()在每次调用2.7us时减慢了两倍。 Formatter.format()在每次调用2.5us时也慢了两倍。 现在看来, DecimalFormat.format()仍然是这些替代品中最快的。

为什么VisualVM Profiler不会配置我的应用程序?

我创建了一个简单的1文件java应用程序,它循环遍历循环,调用一些函数,分配一些内存,添加一些数字等。我通过eclipse的Run As->Java Application运行该应用Run As->Java Application 。 正在运行的应用程序显示在Local Visual Basic下的Java VisualVM中。 我双击该应用程序并转到Profiler选项卡。 默认设置为: Start profiling from classes: my.main.package.** Do not profile classes: java.*, javax.*, sun.*, sunw.*, com.sun.* 我点击CPU 。 CPU和Memory按钮变灰。 什么都没发生。 Status表示profiling inactive 。 当我的应用程序终止时, Status表示application terminated 。 我在这做错了什么? 我需要调整一些设置吗? 启动应用程序时是否需要设置VM标志?

Java文本分析库

我正在寻找一个java驱动的解决方案,以满足分析句子的需求,以记录关键词是正面还是负面使用。 即关键词可能是’cabbages’和句子: – ‘我喜欢卷心菜但不喜欢豌豆’ 我想要一种java文本分析器来记录这个积极的东西。 lucene(Hibernate-Search)库可以用于此吗? 有什么想法吗?

使用死Groovy代码定位填充PermGen的代码

我们已经使用java.lang.OutOfMemoryError: PermGen space每两周对我们的glassfish实例进行一段时间的研究。 我将PermGen空间增加到512MB,并使用jstat -gc转储内存使用量。 两周后,我想出了下图,显示了PermGen空间是如何稳定增加的(x轴上的单位是分钟,y轴是KB)。 我试着用谷歌搜索某种可以查明错误的分析工具,并在SO上提到了一个提到jmap的post,这被certificate是非常有用的。 在从jmap -permstats $PID转储的大约14000行中,大约12500行包含groovy/lang/GroovyClassLoader$InnerLoader ,指向我们自己的Groovy代码或Groovy本身的某种内存泄漏。 我必须指出,Groovy构造的相关代码库不到1%。 示例输出如下: class_loader classes bytes parent_loader alive? type 3811 14830264 null live 0x00007f3aa7e19d20 20 164168 0x00007f3a9607f010 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00007f3a7afb4120 0x00007f3aa7c850d0 20 164168 0x00007f3a9607f010 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00007f3a7afb4120 0x00007f3aa5d15128 21 181072 0x00007f3a9607f010 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00007f3a7afb4120 0x00007f3aad0b40e8 36 189816 0x00007f3a9d31fbf8 dead org/apache/jasper/servlet/JasperLoader@0x00007f3a7d0caf00 …. 那么我该如何继续了解更多关于导致此问题的代码? 在本文中,我推断我们的Groovy代码是在某处动态创建类。 从jmap的转储我可以看到大多数死对象/类(?)都有相同的parent_loader,虽然我不确定在这种情况下这意味着什么。 我不知道怎么从这里开始。 附录 对于后来者来说,值得指出的是, 接受的答案并不能解决问题 […]

Java应用程序分析

我正在寻找一个Java代码分析器,我可以用它来分析我的应用程序(它是一个在后端运行的服务)生产(所以意味着低调,它不能减慢我的应用程序)。 主要是我想调用树分析,也就是说a()调用b()然后b()调用c(),然后a()b()和c()花了多少时间,包括和排他。 已经看过jvisualvm和jprofiler ,但这不是我想要的,因为我无法将我的生产应用程序绑定到它们,因为它会导致一个主要的性能问题。 此外,我确实通过了metrics ( https://github.com/dropwizard/metrics ),但它没有给我一个function来分析调用树。 Callgrind ( http://valgrind.org/docs/manual/cl-manual.html )类型库是我需要的,因为它提供了调用树分析function和高级选项,如避免调用循环(递归)。 但是我不确定Callgrind是否可以用于生产,因为它会在程序终止时转储数据。 任何人都可以建议用于java的好的调用树分析器,可以在不影响性能的情况下用于生产吗?

来自Java的CPU负载

有没有办法在不使用JNI的情况下获取Java下的当前cpu负载?

这是否意味着Java Math.floor非常慢?

我不是很多Java。 我正在编写一些优化的数学代码,我对我的分析器结果感到震惊。 我的代码收集值,交错数据,然后根据它选择值。 Java运行速度比我的C ++和MATLAB实现慢。 我正在使用javac 1.7.0_05我正在使用Sun / Oracle JDK 1.7.05 存在一个在代码中执行相关任务的floor函数。 有人知道解决这个问题的范式方法吗? 我注意到我的floor()函数是用StrictMath定义的。 是否有类似Java的-ffast-math ? 我期待必须有一种方法可以将地板function更改为更合理的,而无需编写自己的function。 public static double floor(double a) { return StrictMath.floor(a); // default impl. delegates to StrictMath } 编辑 所以有些人建议我尝试演员。 我尝试了这一点,并且壁挂时间绝对没有变化。 private static int flur(float dF) { return (int) dF; } 413742铸造地板function 394675 Math.floor 这些测试没有分析器。 我们努力使用分析器,但运行时间发生了翻天覆地的变化(15分钟以上,所以我退出了)。

在Java应用程序中分析内存使用情况的最佳方法?

我知道在此之前已经有人问过类似的问题,但是让我准确描述一下我需要做什么: 我有一组运行命令行java应用程序的测试,我想为它们添加内存分析。 我看到的一个选项是向我的应用程序添加代码(可能使用第三方工具/库),这将提供内存快照。 另一种选择是使用第三方工具来管理/检测我的应用程序和JVM(理想情况下不需要我更改我的代码)。 我想的是像Valgrind这样的东西,但是对于Java来说。 如果可能的话也是开源的。 我真正想要做的是设置内存测试,以便定期监视我的内存使用情况,比如说每秒,然后转储到文本文件中。 这样我就可以看到内存使用量是否会随着时间的推移而振荡/增加/减少。 我还能够计算最大和最小峰值。 有人在这做过这样的事吗? 提前致谢。

Java应用程序的性能分析器

我需要优化Java应用程序。 它会进行一些第三方通话。 我需要一些好的工具来准确测量各个API调用所花费的时间。 为了解复杂性 – 应用程序采用包含100万行的数据源文件,完成处理大约需要一个小时。 作为处理的一部分,它会进行一些第三方呼叫(包括一些网络呼叫)。 我需要确定哪些调用比其他调用花费更多时间,并在此基础上找到优化应用程序的方法。 任何建议,将不胜感激。