【问题标题】:java stress testing and memoryjava压力测试和内存
【发布时间】:2012-06-05 22:22:49
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: java memory heap-memory


    【解决方案1】:

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

    【讨论】:

    • 谢谢彼得,我添加了这个参数,我得到了非常有趣的结果,现在我要学习了。我也试过参数化 jvm 添加 -Xmn100M -Xms500M -Xmx500M 结果更好,更有意义
    【解决方案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

    【讨论】:

    • 感谢 Malcom 的链接,它们非常有趣!!
    猜你喜欢
    • 2011-12-08
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2014-05-31
    • 2011-08-11
    • 2010-09-22
    相关资源
    最近更新 更多