我的java应用程序执行大量IO操作并消耗大量内存和CPU(序列化和反序列化)。通常有一段时间我的应用程序会在某些时间内抛出内存异常,即使堆大小已经增加并且GC调整时间减少了...... :(因此,无法获得预期的性能级别。我发现了一些问题like thiis。但它们是理论上的,无法找到适合我的问题。
目前我在线程中分担负载。我怎么看是否可以通过将负载放入不同的JVM来获得任何性能改进。我想知道
答案 0 :(得分:3)
我的java应用程序执行大量IO操作并消耗大量内存 和CPU(序列化和反序列化)。
您指的是磁盘I / O还是网络I / O或两者兼而有之? 如果瓶颈是磁盘I / O而你有一个SATA硬盘,那么同一主机上的更多线程或jvm将无济于事。跨主机或其他磁盘选项的负载平衡可以提供帮助。你需要尝试一下。
有一段时间我的应用程序抛出了内存异常
这可能是由于多种原因造成的。如果它是堆,如果你看到没有内存泄漏或不需要的内存利用率,那么增加堆可能会有所帮助。这可能会影响gc暂停时间。这取决于您已经拥有多少堆以及适当的gc选项。多个jvms可能会有所帮助。 创建大量线程也可能导致OOM。
如果你是CPU绑定的,那么增加线程数或拥有多个jvms将无济于事,除非CPU数量增加。
跨多个jvms共享意味着运行应用程序的多个实例。这可以通过负载平衡器来实现。 [编辑]不同的jvms可以通过RMI等相互通信,但我想你并没有真正关注进程间通信。
第一步是通过分析和加载测试来识别瓶颈,然后开始调整它。