JVM性能优化之JVM调优

文章目录

  • JVM性能优化之JVM调优
  • 前言
  • 一、GC的评估指标
  • 二、怎么进行JVM调优
  • 三、如何分析内存溢出问题

前言

通过前面的文章对JVM已经进行了简单的了解了,也知道了各种垃圾收集器以及其配置,那么这篇文章我们就简单地进行实例讲解了,如何进行JVM调优?JVM调优我们具体调整什么?为什么要调整这部分?怎么调整?

一、GC的评估指标

进行JVM调优主要针对下面几个方面:

  • 吞吐量: 吞吐量指的是运行用户代码占总时间的比例,它有一个计算公式为:吞吐量 = 应用程序运行的时间/ (应用程序运行的时间 + GC回收的时间); 举个例子,假设程序运行时间为100s,GC垃圾回收时间为1秒,则吞吐量为100/(1+100) = 99%;如果这个值越小代表着垃圾回收占用的时间越多,GC垃圾回收占用时间多的原因就是堆内存不足导致垃圾回收的频率太多
  • GC负荷: GC负荷是与吞吐量相对的一个概念,指的是GC花费时间的百分比;其计算公式为:GC负荷 = GC回收的时间/ (应用程序运行的时间 + GC回收的时间)
  • 响应时间: 这里的响应时间是GC执行垃圾回收时导致的STW的时间,这段时间除了GC其它所有线程都是停止的,当然我们期望的暂停时间越小越好。
  • GC频率: GC频率指的是在时间单位内GC进行垃圾回收的次数,当然GC频率与响应时间是反比的。假设堆内存一定的情况下,GC执行的频率越大代表着响应时间越小,而GC执行频率越小代表着响应时间越大。
  • 反应速度: 反应速度指的是一个对象变成垃圾一直到被回收所耗费的时间。

在我们讲垃圾回收的时候讲了一个收集器Parallel收集器,这个收集器就是注重吞吐量的,这个收集器是JDK默认的垃圾回收器。
响应时间优先的垃圾收集器,CMS收集器(老年代) /ParNew(新生代)。
G1收集器两者兼顾

二、怎么进行JVM调优

上面简单的说明了几个GC性能进行评估的指标,在实际操作中我们主要以吞吐量、响应时间优先,所以最终JVM调优后的代码我们期望看到的是高吞吐量+低响应时间

  1. 首先肯定需要考虑的是堆内存的大小,要合理的设置堆内存大小,怎么配置堆内存大小呢,这个可以借鉴腾讯云服务器给出的答案。

    这是腾讯云服务器选型,按照选型的参照有一定访问量的我们就按照2G设置,并发适中的4G设置,并发比较大的设置8G+。当然这个是服务器的内存大小,但是这个默认服务器只有我们的应用程序没有其他很耗费内存的应用。
  2. 第二点启动的时候堆内存初始值和最大值保持一致,防止内存不足垃圾回收后导致的内存扩大浪费时间,包括像新生代等有初始值和最大值的都尽量设置为同样的参数。
  3. 不要去主动的调用System.gc()方法,会导致垃圾回收,而且是Full GC的,触发STW机制。
  4. 设置大对象存放参数,超过的放在老年代,因为大对象比较大在新生代里面拷过来拷过去的很浪费性能,而且会导致GC频繁,设置参数为:-XX:PretenureSizeThreshold
  5. 根据项目的情况合理的选择垃圾收集器,怎么选择垃圾收集器呢,这有个建议:还是按照上面的三种类型,2GB的使用Parallel收集器,这是以吞吐量优先的收集器,是默认的垃圾收集器,设置参数为 -XX:+UseParallelOldGC;对于4GB的使用CMS收集器,注重服务器的响应速度,系统停顿时间最短,设置参数为 -XX:+UseConcMarkSweepGC;对于8G甚至更大的使用G1收集器,将大内存设置成了多个小区域,而且回收按照区域优先级进行的,可以保证高吞吐量的同时做到低响应时间,设置参数为 -XX:+UseG1GC
  6. 设置了不同的垃圾收集器还要根据实际的GC日志进行分析来调整其他参数进行调优。
  7. 这是最重要的一点,其实大多数情况是代码不合格。其实优化代码带来的性能提升远比优化JVM参数要大的多。

三、如何分析内存溢出问题

先写个演示代,演示代码是一直进行死循环创建对象放到list中,这样创建的对象是可达的。

   public static void main(String[] args) throws InterruptedException {List list = new ArrayList();while (true){list.add(new String("123"));}}

打开jvisualvm分析工具后选中我们写的程序,找到抽样器进行内存抽样,下面两个图为抽样结果

首先看这张图,我们抽样出来的堆柱状图,这下面的列表是每种对象所使用的空间大小,没有告诉我们哪里导致的的内存溢出,但是我们可以得出结论创建的String对象太多导致了堆内存溢出。
再选中每个线程分配

看一下线程分配情况,这个列表是每个线程使用的堆内存大小,我们可以看到main线程占用了绝大部分的堆空间,几乎占满了,这个时候就可以定位到内存溢出可能是因为main线程创建了大量的String对象导致的,然后去排查main线程里面的代码是否有问题。
这里其实可以看到一个阿里巴巴开发规范中的提到的规范:每个线程都要创建一个属于自己的名字。有了这个线程名字是不是就查找起来方便多了,要是一堆线程名叫Thread1、Thread2。。。看到这个也找不到导致内存溢出的线程。

注意:GC分析的时候最好使用dump日志快照来分析,因为分析软件和应用程序两个应用之间建立通信导致的数据可能会造成干扰。

内容来源:蚂蚁课堂

JVM性能优化之JVM调优相关推荐

  1. Spark性能优化:Shuffle调优篇

    Spark性能优化:Shuffle调优篇 一.调优概述 大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO.序列化.网络数据传输等操作.因此,如果要让作业的性 ...

  2. GPU性能优化之CUDA调优指南

    GPU性能优化之CUDA调优指南 GPU性能优化之CUDA调优指南 1 整体性能优化策略 2 最大化利用率 2.1 应用程序层次 2.2 设备层次 2.3 多处理器层次 2.3.1 占用率计算 3 最 ...

  3. 性能优化之MySQL调优篇

    MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作 ...

  4. 性能优化专题 - MySql 性能优化 - 04 - MySql调优

    目录导航 前言 Undo-log与Redo-log 案例 当前读.快照读 Redo Log的落盘配置 MySQL配置优化 MySQL服务器参数类型 快速定位MySql配置文件 MySQL内存参数配置 ...

  5. Spark性能优化:资源调优篇

    在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...

  6. Spark性能优化之-资源调优

    文章目录 概述 Spark作业基本运行原理 资源参数调优 num-executors executor-memory executor-cores driver-memory spark.defaul ...

  7. Spark性能优化之-开发调优

    文章目录 概述: 原则一:避免创建重复的RDD 原则二:尽可能复用同一个RDD 原则三:对多次使用的RDD进行持久化 Spark的持久化级别 如何选择一种最合适的持久化策略 原则四:尽量避免使用shu ...

  8. Spark性能优化之-shuffle调优

    文章目录 概述 ShuffleManager发展概述 HashShuffleManager运行原理 未经优化的HashShuffleManager 优化后的HashShuffleManager Sor ...

  9. Android性能优化之虚拟机调优

    介绍完 深入学习Android:虚拟机&运行时 之后,很多小伙伴问我,你描述的这些知识结构看起来艰深晦涩高大上,实际工作中能有多大用途呢?今天我就简单举个例子. 众所周知,我们的Android ...

  10. mysql 字符串索引 优化_MySQL性能优化之索引调优实战

    索引失效场景或使用注意事项 a.索引无法存储null值,所以建议都给默认值 b.如果条件中有or,即使使用了索引条件也不起作用,所以尽量少用or 如果想使用or,又让索引生效,只能将or的每个列上加上 ...

最新文章

  1. Android中View绘制流程以及invalidate()等相关方法分析
  2. C#中在窗体应用中使用StringBuilder拼接显示网页
  3. gerrit的使用和配置
  4. abap 一些小知识点的总结
  5. Nginx配置静态资源
  6. 我的测试生活感悟4 - 谈谈面试
  7. 10个最棒的jQuery视频插件
  8. 华中科技大学计算机基地班,华中科技大学基地班管理方法.doc
  9. 华为手机上的计算机怎么没了,华为手机怎么连接电脑 华为手机连接不上电脑怎么回事 华为手机连接USB没反应...
  10. 右键txt打开html,文件解压不了怎么办 右键菜单中选择解压文件
  11. 餐饮外卖平台小程序源码_餐饮连锁店,加盟,入住
  12. python基础-异常处理try-except
  13. geany配置python_Python 04 Geany的安装和配置
  14. vue中echarts纵轴添加点击事件
  15. mysql-5.7.11-winx64_mysql 5.7.11 winx64安装配置教程
  16. Ubuntu16.04+CUDA8.0+GTX960M安装
  17. 计算几何(立体几何)基础篇
  18. android多线程下载3
  19. Codeforces#1157 F. Ehab and the Big Finale (思维+交互题)
  20. 1.8-08:矩阵加法

热门文章

  1. 五、实现一个10秒钟的倒计时,即:从10~0依次打印,每次打印间隔一秒
  2. 运筹说 第4期|掌握运筹学软件,走遍天下都不怕
  3. 学习笔记-Matlab算法篇-动态规划
  4. python数据分析百度云资源_数据分析师视频教程百度云网盘下载
  5. Proteus8.9 下载与安装教程
  6. CFS内网渗透三层内网漫游靶场-2019某CTF案例
  7. LWIP协议 | 理论基础知识解析
  8. fiddler手机模拟器抓包_fiddler抓包+雷电模拟器 完成手机app抓包的配置
  9. html 跑马灯效果 源代码,跑马灯效果.html
  10. 【Unity3D日常BUG】Unity3D中使用高亮插件Highlighting出现的错误:Parameter name:shader