java方法的高执行时间

Posted

技术标签:

【中文标题】java方法的高执行时间【英文标题】:High Execution time on java methods 【发布时间】:2011-08-15 22:01:36 【问题描述】:

我在 CentOS 5.4 VPS 上运行 java 服务器。 VPS统计: - 2.5GHz 单核 CPU - 2GB 内存 - OpenJDK 1.6(也试过 Sun JDK 1.7)

Java 进程的 CPU 使用率一直很高。然后我去尝试分析java进程,看看是什么导致了速度变慢。我发现简单的方法(如 Random.nextInt(): 787ms)需要 1000 毫秒才能完成一次通话。大多数方法不应该花费这么长时间,并且在我的服务器上导致非常高的 CPU 使用率。这是 CentOS 的问题吗?还是Java?还是有什么我没有在我的 VPS 上正确配置的东西?

【问题讨论】:

根据所使用的随机方法,机器可能已经没有多少熵了,正在等待更多的熵出现,然后再生成下一个数字。 无论如何...获得一个随机的 int 应该不会花费将近一秒钟的时间。在虚拟环境中,您的虚拟服务器可能在严重超额订阅的硬件上,而使用 vmstat 等操作系统级别的工具是看不到的。如果您通过 SSH 连接到盒子,它会感觉反应灵敏还是反应迟钝? 当 java 不占用 97% 左右的 CPU 时,它是相当快的。我已经对此进行了测试 ** 我已经在我的计算机上的 VirtualPC (Ubuntu 10.04) 上对此进行了测试,它似乎也有这个问题。另外,如果重要的话,我的 VPS 是基于 Xen 的。 @Adam: Random 不使用熵,使用熵的是SecureRandom 【参考方案1】:

不要在源代码中添加计时,而是尝试使用像 BTrace:http://kenai.com/projects/btrace 这样的 java 代理,它可以让您掌握所需的信息,但不会弄乱您的应用程序源代码。

BTrace 可以与 EurekaJ 等可视化工具结合使用(我创建的一个用于可视化 BTtrace 输出的项目):http://eurekaj.haagen.name

其他商业分析选项也可用,例如 JProfiler 或 YourKit,但它们确实带有价格标签。

【讨论】:

【参考方案2】:

当您测量程序中的处理时间时,您能否重现您的时间安排,即类似于以下内容:

long start = System.currentTimeMillis();

/* Your code */

[...]    

long time = System.currentTimeMillis() - start;

System.out.println("Measurement: " + time);

另外,“当 Java 不占用 97% 的 CPU 时它很快”是什么意思?为什么 Java 首先占据 97%?是否有多个线程在运行?您的计算是短期运行还是长期运行?

【讨论】:

我稍后会尝试一些时间。 “当 Java 不占用 97% 的 CPU 时速度很快”评论说,当这些方法花费这么多时间时,它们会使用大部分 CPU 来完成简单的任务。

以上是关于java方法的高执行时间的主要内容,如果未能解决你的问题,请参考以下文章

java 方法 执行超时处理

java 线程 设置每周的某一天的某个时间执行一次,用哪个方法。SchedulerTask

java执行方法一定执行类吗

[Java] HashMap 导致的高 CPU 使用率

java 如何计算在Java中执行方法所花费的时间

java定时任务——间隔指定时间执行方法