如何着手JVM性能调优

一、JVM 调优分类

       调优是一个很大的概念, 简单说就是把系统进行优化, 但是站在一个系统的角度, 能够干的事情太多了, 我们一般把 JVM 调优分成以下三类:

  • JVM 预调优
  • 优化 JVM 运行环境(慢、 卡顿等)
  • 解决 JVM 中的问题(OOM 等)


二、JVM 预调优的步骤

1、计算内存需求

       计算内存需求, 内存不是越大越好, 对于一般系统来说, 内存的需求是弹性的, 内存小, 回收速度快也能承受。 所以内存大小没有固定的规范。虚拟机栈的大小在高并发情况下可以变小。元空间(方法区) 保险起见还是设定一个最大的值(默认情况下元空间是没有大小限制的) , 一般限定几百 M 就够用了, 为什么说还限定元空间。
       举例子: 一台 8G 的内存的服务器, 如果运行时还有其他的程序加上虚拟机栈加上元空间, 占用超过 6 个 G 的话, 那么我们设定堆是弹性的(max=4G) ,那么其实堆空间拓展也超不过 2G, 所以这个时候限制元空间还是有必要的。

2、选定CPU  

       对于系统来说, CPU 的性能是越高越好, 这个按照你的预算来定。尤其是现在服务器做了虚拟机化之后, 虚拟机的性能指标不能单看虚拟化后的参数指标, 更应该看实际物理机的情况

3、选择合适的垃圾回收器

      对于吞吐量优先的场景, 就只有一种选择, 就是使用 PS 组合(Parallel Scavenge+Parallel Old)。
      对于响应时间优先的场景, 在 JDK1.8 的话优先 G1, 其次是 CMS 垃圾回收器。

4、设定新生代大小、 分代年龄

     吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的新生代和一个较小的老年代.原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而老年代尽存放长期存活对象。

5、设定日志参数

-XX:+PrintGC 输出 GC 日志
-XX:+PrintGCDetails 输出 GC 的详细日志
-XX:+PrintGCTimeStamps 输出 GC 的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出 GC 的时间戳(以日期的形式, 如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行 GC 的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径

三、优化 JVM 运行环境(慢、 卡顿等)

       一般造成 JVM 卡或者慢的原因无非两个部分, 一个是 CPU 占用过高, 一个是内存占用过高。 所以这个时候需要我们进行问题的排查, 进行具体的故障分析。
 

四、解决 JVM 中的问题(OOM 等)

       我们知道,报oom的错误,可以出现在以下几个地方:栈、堆内存、直接内存、方法区等主要内存区域。

       但是它们都有一个共同点,都会出现OOM。如果出现了,先要考虑分配的内存大小是否合适,如果调整了大小,还是会出现OOM,就需要考虑是不是发生了内存泄露,这时就需要看看代码是否写得有问题了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值