文档章节

jvm调优总结

Funcy1122
 Funcy1122
发布于 2018/08/17 00:17
字数 1508
阅读 7
收藏 0

1.jvm运行模式

  • client模式:启动快,占用内存少,jit编译器生成代码的速度也更快.
  • server模式:主要优势在于代码优化功能,这个功能对于服务器应用而言尤其重要.
  • tiered server模式:结合了client与server的长处,即快速启动和高效的生成代码.通过-server -XX:+TieredCompilation启用

2. 32/64位jvm(linux机器)

  • java堆小于2GB,选择32位jvm
  • java堆介于2GB于32GB之间,使用-d64 -XX:+UseCompressedOops命令选项的64位jvm
  • java堆大于32GB,使用-d64选项的64位jvm

3. hotspot内存分配

  • -Xms<n>[g|m|k]:java堆最小值
  • -Xmx<n>[g|m|k]:java堆最大值.关注吞吐量及延迟的java应用程序应该将-Xmx与-Xms设置为同一值,因为无论扩展还是缩减新生代空间或老年代空间,都需要进行Full GC.
  • -XX:NewSize=<n>[g|m|k]:新生代空大小的初始值,也是最小值.指定此项时,应同时指定-XX:MaxNewSize=<n>[g|m|k]
  • -XX:MaxNewSize=<n>[g|m|k]:新生代空间大小的最大值,指定此项时,应同时指定-XX:NewSize=<n>[g|m|k]
  • -Xmn<n>[g|m|k]:设置新生代空间的初始值/最小值/最大值.新生代的大小会根据该值设定.需要注意的是,如果-Xms和-Xmx并没设置为同一值,使用-Xmn时,java堆变化不会影响新生代空间,即新生代空间的大小总保持恒定.
  • -XX:PermSize=<n>[g|m|k]:永久代空间的初始值及最小值
  • -XX:MaxPermSize=<n>[g|m|k]:永久代空间的最大值

4. java堆内存分配规则

在应用程序到达稳定后,可多次进行Full GC,查看java内存使用情况,统计java程序的活跃数据.可使用Jvisualvm进行Full GC,查看gc日志或Jvisualvm的visual gc插件查看应用程序内存使用情况,获取内存空间占有量.

java堆大小计算法则:

空间命令行选项占用倍数
java堆-Xms和-Xmx3-4倍full gc后的老年代空间占用量
永久代-XX:PermSize,-XX:MaxPermSize1.2-1.5倍full gc后的永久代空间占用量
新生代-Xmn1-1.5倍full gc后的老年代空间占用量
老年代java堆大小减新生代大小2-3倍full gc后的老年代空间占用量

注:这一步分配的内存并不一定达到预期,可继续优化新生代/老年代等.

5. 优化新生代的大小

分析gc数据,

  • 如果发现minor gc的间隔时间过长,则减少新生代的空间;
  • 如果发现minor gc的频率太高,则加大新生代空间.

准则:

  • 老年代空间大小不应该小于活跃数据大小的1.5倍.
  • 新生代空间至少应为java堆大小的10%,通过-Xmx和-Xms可以设定该值.
  • 增大java堆大小时,需要注意不要超过jvm可用的物理内存数.

6. 优化老年代大小

如果预测或观测到full gc的频率不能达到应用程序的最差full gc频率要求,就应该增大老年代空间的大小.

增加老年代空间的大小时,注意保持新生代空间大小的恒定,即增加java堆大小,使用-Xms和-Xmx设定.

7. 为cms调优延迟

调优cms收集器的目的是避免发生stop-the-world的压缩式GC.

从Throughput收集器迁移到cms收集器时需要遵守一个通用原则是,将老年代空间增大20%~30%,这样才能更有效地运行cms收集器.

8. survivor空间

  • survivor空间大小设置:-XX:SurvivorRatio=<ratio>
  • survivor空间大小=-Xmn<value>/(-XX:SurvivorRatio=<ratio> + 2)

调整survivor空间需要保持时应保持eden空间大小不变,应同时调整java堆大小及新生代大小.

例:现有如下配置:
-Xmx1536m -Xms1536m -Xmn512m -XX:SurvivorRatio=30

经计算,得

  • survivor=512/(30+2)=16m
  • eden=16*30=480m

现在需要调整survivor大小到32m,调整方式如下:

-Xmx1568m -Xms1568m -Xmn544m -XX:SurvivorRatio=15

若不调整java堆大小及新生代大小,仅调整-XX:SurvivorRatio数值,会减少eden空间大小,将导致更加频繁的minor gc.

9. 晋升阈值

  • 设置命令:-XX:MaxTenuringThreshold=<n>
  • 输出晋升信息:-XX:PrintTenuringDistribugion

10. 初始化cms收集周期,减少stop-the-world

一般情况下,hotspot vm会尝试自适应计算空间占用多大时开启cms收集周期,但有时并不能避免stop-the-world压缩式垃圾收集(gc日志中会出现concurrent mode failure),此时可以使用以下命令行选项使cms更早地进行垃圾收集:

  • -XX:CMSInitiatingOccupancyFraction=<percent> 设定的值表示cms在老年代空间占用达到多少百分比时启动.数值大小应大于老年代占用空间和活跃数据大小之比.

使用以上命令行选项时,需要结合以下命令行一起使用:

  • -XX:+UseCMSInitiatingOccupancyOnly

若不使用该命令,则cms仅第一次使用-XX:CMSInitiatingOccupancyFraction设定的百分比,以后的周期中又转向自适用地启用cms周期.

11. 初始化cms永久代垃圾收集

gc日志中,cms垃圾收集器使用CMS Perm标识永久代的收集.

一般情况下,cms默认不对永久代进行垃圾收集,可以使用以下命令行选项开启cms的永久代垃圾收集:

  • -XX:+CMSClassUnloadingEnabled

同时也可以指定永久代空间占用比例达到多少时启动cms永久代垃圾收集:

  • -XX:CMSInitiatingPermOccupancyFraction=<percent>
  • -XX:+UseCMSInitiatingOccupancyOnly

© 著作权归作者所有

共有 人打赏支持
上一篇: Java中的锁分类
下一篇: java性能监控
Funcy1122
粉丝 7
博文 93
码字总数 135780
作品 0
广州
后端工程师
私信 提问
《成神之路-基础篇》JVM——JVM参数及调优(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 JVM参数及调优 JVM实用参数系列 成为Java GC专家(5)...

2018/05/05
0
0
JavaOne 2016 —— 首日亮点

今年,为期5天的JavaOne会议中,4个会场的议题都进行了直播,演讲稿也在播出之后一并提供。来自Terracotta公司EHCache团队的Henri Tremblay,做了主题为 《学习Java 8:Lambda表达式和函数式...

两味真火
2016/10/01
1K
3
论Java程序猿的自我价值提升,BATJ资深架构体系助你飞跃瓶颈区!

Java那句广为人知的口号“一次编写,处处运行”也体现出Java价值的关键所在—强大的Java虚拟机使得Java具有跨平台兼容性。 目前流行的Java职业路径包括后端开发员、大数据开发员,嵌入式系统...

Java填坑之路
2018/10/30
0
0
如何合理的规划一次jvm性能调优

这是jvm优化系列第三篇: jvm优化——垃圾回收 jvm优化——监控工具 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响。但也有一些基础的理论和原则,理解...

wier
2017/10/25
0
9
JVM参数调优:Eclipse启动实践

JVM参数调优:Eclipse启动实践 本文主要参考自《深入理解 Java 虚拟机》。 这本书是国人写的难得的不是照搬代码注释的且不是废话连篇的技术书,内容涵盖了 Java 从源码到字节码到执行的整个过...

天天顺利
2015/01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

HTTP 304状态码

客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified ...

Jack088
23分钟前
2
0
MyBatis学习笔记(二)

mybatis执行过程架构图 1、mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql...

梦想_与_现实
28分钟前
0
0
分布式锁简单入门以及三种实现方式介绍

分布式锁简单入门以及三种实现方式介绍

zbbmaster
38分钟前
2
0
PHP接收前端传值各种情况整理

PHP接收前端传值各种情况整理 服务端代码: header('Access-Control-Allow-Origin:*');var_dump($_POST);exit; 情况 1) 传null $.post('http://xxxxx.xx/index.php', { "test": null}......

SSSWIIILLL
今天
5
0
利用神器BTrace 追踪线上 Spring Boot应用运行时信息

概述 生产环境中的服务可能会出现各种问题,但总不能让服务下线来专门排查错误,这时候最好有一些手段来获取程序运行时信息,比如 接口方法参数/返回值、外部调用情况 以及 函数执行时间等信...

CodeSheep
今天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部