2012-05-31 76 views
3

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

我启动几次同样的情况下,首先运行我的项目(当然有空缓存):

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

正如你所见,我的问题是第一次执行比其他执行时间要长得多。每个线程都存储在一个Map中的即时对象,并且当它为空时,看起来工作非常缓慢。任何人有任何想法谁可能会去?我试图增加jvm的堆启动内存,但不起作用。 也如果有人知道任何可以阅读,以帮助我感谢它的参考

谢谢。

回答

4

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

+1

感谢彼得,我加这个参数,我获得非常有趣的结果,现在我必须学习在G。我也尝试参数化jvm,加入-Xmn100M -Xms500M -Xmx500M,结果更好,更有意义 – Kalamarico

2

在对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

+2

感谢链接Malcom,它们非常有趣! – Kalamarico