•
内部静态缓存大约 500MB
•
在高峰时间,总预测流量是 5000 个并发用户
•
每个用户的会话数据大约 500K
•
在高峰期间,总流量会话要求是 2.5GB。
正如你所看到的一样,在如此情况下,32 位 JVM 进程就无法满足。一个典型的
解决方案是进行流量拆分,在几个 JVM 进程或物理主机(假设有足够的硬件和 CPU core
可用)上。
大多数时候,业务流量将推动内存占用。除非你需要大量的数据缓存来实现适当
的性能,典型的门户应用网站(媒体)繁重的应用程序需求。数据缓存太多的时候应该用一
个黄色的标志标注一下,最好早点去重新审视一下一些设计元素。
4.量体裁衣
这一条,你应该做到:
•
理解基本的 JVM 原则和内存空间。
•
对所有应用程序有深入的了解及其它们的特点(大小、类型、动态流量、无状态
对象 VS 有状态对象、内部内存缓存等)。
•
对预测业务流量(并发用户)
—
给每一个应用程序能提出很好的观点 如果你需要
一个 64 位的虚拟内存,那么将设置哪个作为开始。
如果需要多个 JVM(中间件)过程。
等一下,这样做并不足够。虽然上面的信息是至关重要的,并且关于 Java 堆的
“
”
设置进行了 最佳猜测 ,对应用程序的行为进行模拟并且进行适当的分析、负载和性能测
试来验证 Java 堆内存要求。
推荐 Jprofiler 工具给大家,学习如何使用一个分析器的最好方法是正确理解应
用程序的内存占用。另一个方法是使用 Eclipse MAT 工具根据现有的环境进行堆转储分
析。堆转储非常强大,它可以允许你查看和理解 Java 堆的整个内存占用,包含类加载器
相关数据和在内存占用分析中必须要做的,特别是内存泄漏。
Java 分析器和堆转储分析工具允许你理解和验证应用程序内存足迹,包含内存
泄漏的检测和解决方案。负载测试和性能测试是必不可少的,通过模拟并发用户来验证早
期评估是否正确,它也会把应用程序瓶颈暴露出来并且允许你进行微调。推荐一个非常容
易上手的工具:Apache Jmeter。
最后将看一下这样的情况,应用程序在 Java EE 环境非常正常,直到有一天完
全正常的设备启动失败,例如硬件问题。突然的环境运行能力下降和整体环境下降,到底
发生了什么?
“
”
引起 多米诺效应 的原因有很多,但缺少 JVM 调优和处理故障转移的能力(短期
额外负荷)是很常见的。如果 JVM 进程运行在 80% + OldGen 空间容量和频繁的垃圾收
集,你如何预期故障转移场景?
前面模拟的负载和性能测试应该模拟这样的场景,调整你的调优设置使您的
Java 堆有足够的缓冲来处理额外的负载(额外的对象)在短期内。这主要适用于动态内存占
用,由于故障转移意味着将重定向一些固定的并发用户给可利用的 JVM 进程(中间件实
例)。
5.分而治之
这一条的前提是你已经完成了几十个负载测试。JVM 已经不存在泄露,你的应用
程序内存不能再进行任何减少。你已经尝试了几个调优策略,例如使用一个 64 位的 Java
堆空间在 10GB 以上。多个 GC 策略,尽管这样,仍然没有找到合适的可以接受的性能水
平?