3

我正在测试一个启动restlet的应用程序,当一个http请求到达restlet时,启动一个新线程并处理请求,应用程序创建一个新对象并存储在地图中(对于压力测试,我正在使用Jmeter ,我看到 java 进程内存有问题,我不知道问题是堆、堆栈还是其他问题,让我们展示一下问题:

我多次启动相同的案例,首先运行我的项目(当然是空缓存):

  1. 500 个线程 -> 线程的平均时间为 1900 毫秒
  2. 500 个线程 -> 线程的平均时间为 600 毫秒
  3. 500 个线程 -> 线程的平均时间为 598 毫秒
  4. 500 个线程 -> 线程的平均时间是 670 毫秒 ....

如您所见,我的问题是第一次执行所需的时间比其他执行要长得多。每个线程都将实例化对象存储在 Map 中,并且当它为空时似乎工作很慢。有人知道谁可能会去吗?我试图增加 jvm 的堆启动内存,但不起作用。如果有人知道任何可以阅读以帮助我欣赏它的参考资料

谢谢。

4

2 回答 2

3

我怀疑您的 JVM 在第一次执行时没有预热。尝试添加-XX:+PrintCompilation以查看代码是否在第一个测试中被编译,而不是第二个。

于 2012-05-31T16:16:57.353 回答
1

在对 Java 应用程序进行性能测试时,您必须始终确保 JVM 有时间“热身”。这是由于现代 JVM(例如 Oracle 的HotSpot JVM在代码运行时进行的优化)所致。

要获得有意义的结果,您需要运行足够的测试用例以使时间稳定,然后再为给定的配置/负载获取结果。

看:

http://stuq.nl/weblog/2009-01-28/why-many-java-performance-tests-are-wrong

http://buytaert.net/files/oopsla07-georges.pdf

于 2012-05-31T16:28:35.027 回答