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方法的高执行时间的主要内容,如果未能解决你的问题,请参考以下文章