文档章节

jvm调优总结

Funcy1122
 Funcy1122
发布于 08/17 00:17
字数 1508
阅读 6
收藏 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
博文 77
码字总数 96914
作品 0
广州
后端工程师
私信 提问
《成神之路-基础篇》JVM——JVM参数及调优(已完结)

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

05/05
0
0
JVM参数调优:Eclipse启动实践

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

天天顺利
2015/01/13
0
0
如何合理的规划一次jvm性能调优

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

wier
2017/10/25
0
9
JVM性能优化, Part 5:Java的伸缩性

ImportNew注: JVM性能优化系列文章前4篇由ImportNew翻译(第一篇,第二篇,第三篇, 第四篇)。本文由新浪微博:吴杰 (@WildJay) 投稿至ImportNew。感谢吴杰! 如果你希望分享好的原创文章或...

梁杰_Jack
2014/10/30
0
0
论Java程序猿的自我价值提升,BATJ资深架构体系助你飞跃瓶颈区!

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

Java填坑之路
10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
4
0
聊聊storm的AggregateProcessor的execute及finishBatch方法

序 本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout......

go4it
今天
3
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
今天
5
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
4
0
利用ibeetl 实现selectpicker 的三级联动

1. js 直接写在html页面上面,ibeetl 就可以动态地利用后台传上来的model List ,不需要每次点击都要ajax请求后台 2. 使用selectpicker 的时候,除了对selecct option的动态处理后,还需要 $("#...

donald121
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部