『Java』Java JVM常见面试题:JVM调优案例
GC调优策略
降低Minor GC频率
- Minor GC的时间分为两部分:扫描新生代和复制存活对象时间 。
- 如果堆中短期的对象很多 , 扩容新生代的大小(虽然会增加扫描新生代的时间 , 但同时也会缩短复制对象的时间 , 因为减少了存回对象的数量 。 对于老年代来说 , 进行Major , 甚至是Full GC来说 , 所需要的时间也会减少 。 PS:扫描对象成本明显低于复制存活对象的成本)
- 如果堆中长期存活的对象很多 , 则不应该增加新生代的大小 , 因为会增加Minor GC的时间(扫描和复制存活对象的时间 , 都不会减少)
- 减少大对象的创建
- 会超过所设置的大对象大小的阈值 , 直接进入老年代
- 即时没有超过所设置的大对象大小的阈值 , 在新生代空间有限的情况下 , 根据空间分配担保也会有大几率被分配到老年代
- 增大堆内空间
- 设置初始化堆内存和最大堆内存大小相同 , 也可以降低Full GC的频率 。 也会减少内存自动扩容、自动降容的成本 。
- 对单次操作的响应时间有优先的要求 , 可以选择CMS和G1收集器
- 堆系统吞吐量有优先的要求 , 可以选择Parallel Scavenge收集器
- 场景:一个统计/大文档系统 , 给HotSpot虚拟机分配2G内存 , 用户使用觉得网站比较慢 , 在运维把内存升到12G 。
- 问题:经常发生无规律长时间失去响应 。
- 原因:(Parallel Scavenge/Old收集器)过大的堆内存进行Full GC时 , 用户线程长时间停顿导致(之前服务的堆内存2G , 在进行Full GC时 , 用户线程停顿时间稍断 , 所以用户在访问时 , 只是会觉得慢 , 但是把内存增加到12G之后 , 老年代在进行Full GC时 , 需要回收的内存变大 , 所需的时间就会增加 , 甚至会超过web服务器的响应时间 , 失去响应) 。
- 部署方面(单机的情况下):
- 单独的Java虚拟机实例的缺点
- 『Java』java数据结构系列——什么是数据结构
- 『Java』马云:成功人跟普通人差不多,但这三点我一定要分享给所有年轻人
- #Java#java线程到底有多少种状态?
- #智能手表#1、初识java-1
- [华为]有朋友问我“JAVA全栈”、“互联网架构师”和“JAVAEE”到底是什么?
- 「javascript」这边走Javascript了解一下
- 「华为」一篇有趣的Java class
- struts@Java面试之项目面试问题——不看面试会后悔的
- 「Java」六面蚂蚁金服,唬住了面试官要了30K;其实Java面试也没那么难
- Java@23种java设计模式之:建造者模式、工厂方法模式、抽象工厂模式!