Java 方法执行时间过长

3
我在一台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?

2
根据所使用的随机方法,计算机可能没有太多的熵值,并正在等待更多的熵值出现,然后才能生成下一个数字。 - Adam Vandenberg
1
无论如何,获取随机整数不应该花费近一秒钟的时间。在虚拟环境中,您的虚拟服务器可能在严重超额订购的硬件上运行,这是您使用vmstat等操作系统级别工具看不到的。如果您通过SSH登录到该服务器,它是否感觉灵敏或缓慢? - Eric J.
我已经在我的电脑上的VirtualPC(Ubuntu 10.04)上进行了测试,似乎也存在这个问题。此外,我的VPS是基于Xen的,如果有影响的话。 - Zachar543
@Adam:Random 不使用熵,而是 SecureRandom 使用熵。 - rossum
我正在使用的服务器是Minecraft Bukkit服务器。在分析器中,我看到有很多时间被用于Thread.sleep。这是不好的编程实践吗?还是它是问题的一部分?我发现另外两个实例,其中Random.nextFloat花费了149ms,而Random.nextInt花费了121ms(这两个实例都在我的计算机上的虚拟PC上)。 - Zachar543
显示剩余4条评论
2个回答

3
不要在源代码中添加时间信息,尝试使用像BTrace这样的Java代理:http://kenai.com/projects/btrace,它可以让你获取所需的信息,但不会破坏你的应用程序源代码。
BTrace可以与可视化工具配合使用,比如EurekaJ(我创建的一个项目,用于可视化BTrace输出):http://eurekaj.haagen.name 还有其他商业性能分析选项可供选择,如JProfiler或YourKit,但它们都需要付费。

0

当您在程序内测量处理时间时,您能否复制自己的时间记录,例如以下内容:

long start = System.currentTimeMillis();

/* Your code */

[...]    

long time = System.currentTimeMillis() - start;

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

此外,“当Java未占用97%的CPU时,它为什么会很快”这句话是什么意思?首先,为什么Java会占用97%的CPU?是否有多个线程在运行?你的计算是短时间还是长时间运行的?


我稍后会尝试一些计时。"当Java没有占用97%的CPU时速度很快"这句话是说,当这些方法花费了大量时间来执行简单任务时,它们会占用大部分CPU资源。 - Zachar543

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接