前言

在JVM性能调优时有三个组件:

  1. 堆大小调整(内存最够大的话,尽量搞大点)
  2. 垃圾收集器调整
  3. JIT 编译器(比较深,需要掌握源码才能更好的优化更加底层)

大多数调优选项都与调整堆大小和为您的情况选择最合适的垃圾收集器有关。JIT编译器对性能也有很大影响,但很少需要使用较新版本的JVM进行调优。通常,在调优Java应用程序时,重要是以下两个主要目标之一:

  • 响应性:应用程序或系统对请求的数据进行相应的速度,对于专注于响应性的应用程序,长的暂停时间是不可接受的,重点是在短时间内做出回应。
  • 吞吐量:(批处理任务,大数据量任务)侧重于在特定时间段内最大化应用程序的工作量,对于专注于吞吐量的应用程序,高暂停时间是可接受的。由于高吞吐量应用程序在较长时间内专注于基准测试,因此不需要考虑响应时间。

注意:系统瓶颈核心还是在应用代码,一般情况下无需过多调优,JVM本身在不断优化。

一、verbose:gc

表示,启动jvm的时候,输出jvm里面的gc信息。格式如下:

[Full GC 178K->99K(1984K), 0.0253877 secs]

解读:Full GC 就表示执行了一次Full GC的操作,178K 和99K 就表示执行GC前内存容量和执行GC后的内存容量。1984K就表示内存总容量。后面那个是执行本次GC所消耗的时间,单位是秒。

二、-XX:+printGC

这个打印的GC信息跟上个一样,就不做介绍了。

三、-XX:+PrintGCDetails

打印GC的详细信息。格式如下:

–Heap
– def new generation total 13824K, used 11223K [0x27e80000, 0x28d80000, 0x28d80000)
– eden space 12288K, 91% used [0x27e80000, 0x28975f20, 0x28a80000)
– from space 1536K, 0% used [0x28a80000, 0x28a80000, 0x28c00000)
– to space 1536K, 0% used [0x28c00000, 0x28c00000, 0x28d80000)
– tenured generation total 5120K, used 0K [0x28d80000, 0x29280000, 0x34680000)
– the space 5120K, 0% used [0x28d80000, 0x28d80000, 0x28d80200, 0x29280000)
– compacting perm gen total 12288K, used 142K [0x34680000, 0x35280000, 0x38680000)
– the space 12288K, 1% used [0x34680000, 0x346a3a90, 0x346a3c00, 0x35280000)
– ro space 10240K, 44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
– rw space 12288K, 52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)

解读:new generation 就是堆内存里面的新生代。total的意思就是一共的,所以后面跟的就是新生代一共的内存大小。used也就是使用了多少内存大小。0x开头的那三个分别代表的是 底边界,当前边界,高边界。也就是新生代这片内存的起始点,当前使用到的地方和最大的内存地点。

eden space 这个通常被翻译成伊甸园区,是在新生代里面的,一些创建的对象都会先被放进这里。后面那个12288K就表示伊甸园区一共的内存大小,91% used,很明显,表示已经使用了百分之多少。后面的那个0x跟上一行的解释一样。

from spaceto space 是幸存者的两个区。也是属于新生代的。他两个区的大小必须是一样的。因为新生代的GC采用的是复制算法,每次只会用到一个幸存区,当一个幸存区满了的时候,把还是活的对象复制到另个幸存区,上个直接清空。这样做就不会产生内存碎片了。

tenured generation 就表示老年代。

compacting perm 表示永久代。由于这两个的格式跟前面我介绍的那个几乎一样,我就不必介绍了。

四、-XX:+PrintGCTimeStamps

打印GC发生的时间戳。格式如下:

289.556: [GC [PSYoungGen: 314113K->15937K(300928K)] 405513K->107901K(407680K), 0.0178568 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
293.271: [GC [PSYoungGen: 300865K->6577K(310720K)] 392829K->108873K(417472K), 0.0176464 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]

解读:289.556表示从jvm启动到发生垃圾回收所经历的的时间。GC表示这是新生代GC(Minor GC)。PSYoungGen表示新生代使用的是多线程垃圾回收器Parallel Scavenge。314113K->15937K(300928K)]这个跟上面那个GC格式一样。只不过,这个是表示的是新生代,幸存者区。后面那个是整个堆的大小,GC前和GC后的情况。Times这个显而易见,代表GC的所消耗的时间,用户垃圾回收的时间和系统消耗的时间和最终真实的消耗时间。

五、-X:loggc:log/gc.log

这个就表示,指定输出gc.log的文件位置。(我这里写的log/gc.log就表示在当前log的目录里,把GC日志写到叫gc.log的文件里。)

六、-XX:+PrintHeapAtGC

表示每次GC后,都打印堆的信息。(这个打印的基本格式跟上面第二条的基本类似,我也就不比多说了。)

七、-XX:+TraceClassLoading

监控类的加载。格式如下:

•[Loaded java.lang.Object from shared objects file]
•[Loaded java.io.Serializable from shared objects file]
•[Loaded java.lang.Comparable from shared objects file]
•[Loaded java.lang.CharSequence from shared objects file]
•[Loaded java.lang.String from shared objects file]
•[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
•[Loaded java.lang.reflect.Type from shared objects file]

使用这个参数就能很清楚的看到那些类被加载的情况了。

八、-XX:+PrintClassHistogram

跟踪参数。这个按下Ctrl+Break后,就会打印一下信息:

num #instances #bytes class name
----------------------------------------------1: 890617 470266000 [B2: 890643 21375432 java.util.HashMap$Node3: 890608 14249728 java.lang.Long4: 13 8389712 [Ljava.util.HashMap$Node;5: 2062 371680 [C6: 463 41904 java.lang.Class

分别显示:序号、实例数量、总大小、类型。这里面那个类型,B和C的其实就是byte和char类型。

九、-Xmx -Xms

这个就表示设置堆内存的最大值和最小值。这个设置了最大值和最小值后,jvm启动后,并不会直接让堆内存就扩大到指定的最大数值。而是会先开辟指定的最小堆内存,如果经过数次GC后,还不能,满足程序的运行,才会逐渐的扩容堆的大小,但也不是直接扩大到最大内存。

十、-Xmn

设置新生代的内存大小。

十一、-XX:NewRatio

新生代和老年代的比例。比如:1:4,就是新生代占五分之一。

十二、-XX:SurvivorRatio

设置两个Survivor区和eden区的比例。比如:2:8 ,就是一个Survivor区占十分之一。

十三、-XX:+HeapDumpOnOutMemoryError

发生OOM时,导出堆的信息到文件。

十四、-XX:+HeapDumpPath

表示,导出堆信息的文件路径。

十五、-XX:OnOutOfMemoryError

当系统产生OOM时,执行一个指定的脚本,这个脚本可以是任意功能的。比如生成当前线程的dump文件,或者是发送邮件和重启系统。

十六、-XX:PermSize -XX:MaxPermSize

设置永久区的内存大小和最大值。永久区内存用光也会导致OOM的发生。

十七、-Xss

设置栈的大小。栈都是每个线程独有一个,所有一般都是几百k的大小。

Java虚拟机学习总结(4)—— JVM 性能调优常用参数详解相关推荐

  1. JVM性能调优监控工具使用详解

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 来源:http://uee.me/czpHk 现实企业级J ...

  2. mysql性能调优之 max_allowed_packet 详解 解决ERROR 2006 (HY000): MySQL server has gone away

    mysql性能调优之 max_allowed_packet 详解 一.背景 mysql报错如下: SQLSTATE[HY000]: General error: 2006 MySQL server h ...

  3. Mysql性能调优常用参数配置

    全文中一共有常用的(事实上你如果花1-2周阅读.理解.自己动手设一下后是需要这么多参数的)76个参数 可能你从未看到过这样的一篇集中火力式的把mysql参数列了这么全的文章.因此这一篇是汇集了最精华和 ...

  4. 【JVM】JVM调优常见参数详解

    原文出处: https://blog.csdn.net/jyxmust/article/details/73730766 -Xms2g:JVM启动初始化堆大小为2g,Xms的默认是物理内存的1/64但 ...

  5. MySQL性能调优my.cnf详解

    MySQL 5.6版本适合在1GB内存VPS上的my.cnf配置文件 [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 330 ...

  6. 深入理解JVM性能调优

    深入理解JVM性能调优 您的评价:        收藏该经验     width="728" height="90" frameborder="0&q ...

  7. 深入理解Java虚拟机:Jvm性能调优

    本篇内容包括:Jvm 性能调优简介:根据需求目标进行 Jvm 调优规划(即 调优的目标.调优的步骤):Jvm 调优参数.命令.工具:以及 Java 中的内存泄露问题的详解- 一.Jvm 性能调优简介 ...

  8. java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...

    在上一篇文章中,小编为您详细介绍了关于<变频器调速问题?三星R458更换CPU>相关知识.本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型 ...

  9. 深入理解JVM虚拟机14:JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

最新文章

  1. saltstack(十二)job管理
  2. mysqll底层分享(一):MySQL索引背后的数据结构及算法原理
  3. Prism V2之旅(1)
  4. FPGA的设计艺术(8)最佳的FPGA开发实践之严格遵循过程
  5. [Bjoi2014]大融合
  6. 个人喜欢的关于模式识别、机器学习、推荐系统、图像特征等方面个人主页及博客
  7. 爬虫的步骤解析内容xpath介绍_爬虫入门到精通-网页的解析(xpath)
  8. 怎么样辨别穷人跟有钱人?
  9. Python基础——for循环语句
  10. Ubuntu 14.04 java环境安装配置(不是openJAVA)
  11. mac osx终端命令大全
  12. java.sql.SQLException: The server time zone value ' й ׼ʱ ' is unrecognized or represents more tha
  13. 初识strlen函数
  14. SpringCloud(若依微服务版为例)集成WebSocket实现前后端的消息推送
  15. mysql 改列定义_如何更改MySQL列定义?
  16. kafka flush
  17. Cisco Packet Tracer 超网(CIDR)设置实验
  18. 扫雷计算机教案,四年级上信息技术教案-游戏——扫雷辽师大版
  19. 重启计算机关闭账户,电脑开机重启提示您的账户已被停用怎么办
  20. 图像矫正:桶形畸变矫正的原理及python简易实现与加速

热门文章

  1. html5语音闹钟代码,HTML5数字时钟之闹钟
  2. array 前端面试题_一则关于js数组的前端面试题
  3. 全国计算机二级c语言和江苏教材一样吗,计算机二级省级和全国计算机二级考试内容一样吗...
  4. 萝卜魂军曹机器人_【BANDAI】萝卜魂 全金属狂潮TSR RK-92 野蛮人 沙色
  5. java 页面传值_java-jsp springmvc-controller 传值到页面的方法
  6. php骑手轨迹_用python模拟美团外卖骑手推送请求
  7. 计算机系给未来的自己写信,写信给未来的自己
  8. 累加求和a+aa+aaa+aa…a_过半深圳券商评级跃升4家维持在AA级
  9. php动态写入vue,Vue.js中使用动态组件的方法
  10. centos 7 mysql 源码安装_centos7 mysql5.7.17源码安装