实用JVM参数

1. JIT 编译参数

JIT(Just-In-Time)编译器, 可以在运行时将字节码编译成本地代码,从而提升函数的执行效率。

-XX:CompileThreshold为 JIT编译的阈值, 当函数的调用次数超过-XX:CompileThreshold时,JIT就将字节码编译成本地机器码。

在Client 模式下, XX:CompileThreshold 的取值为1500;

在Server 模式下, 取值是 10000.

JIT编译完成后, JVM便会使用本地代码代替原来的字节码解释执行。

为了内合理的设置JIT编译的阈值, 可以使用-XX:_CITime打印出JIT编译的耗时, 也可以使用-XX:+PrintCompilation 打印出JIT编译的信息。

看例子:

package com.oscar999.performance.JVMTune;public class TestJIT {static long i = 0;/*** @param args*/public static void testJIT(){i++;}public static void main(String[] args) {// TODO Auto-generated method stubfor(int j=0;j<1488;j++)testJIT();long end = System.currentTimeMillis();}}

使用命令运行:

java -XX:CompileThreshold=1500 -XX:+PrintCompilation -XX:+CITime com.oscar999.performance.JVMTune.TestJIT

将以上循环次数从1488 换成 1588, 再运行

可以看到, 大于 1500时, 做了编译成本地码的动作。

2. 堆快照(堆Dump)

获得程序的堆快照文件有很多方法, 比较常用的取得堆快照文件的方法是使用-XX:+HeapDumpOnOutOfMemoryError 参数在程序发生OOM时,导出应用程序的当前堆快照。

-Xmx10m -XX:+HeapDumpOnOutOfMemoryError -XX:heapDumpPath=C:\m.hprof

3. 错误处理

当系统发生OOM错误时,虚拟机在错误发生时运行一段第三方脚本, 比如, 当OOM发生时,重置系统

-XX:OnOutOfMemoryError=c:\reset.bat

4. 获取GC信息

JVM虚拟机也提供了许多参数帮助开发人员获取GC信息。

可以使用  -verbose:gc 或者 -XX:+PrintGC.

如果要获得更加详细的信息, 可以使用 -XX:+PrintGCDetails.

如果需要查看新生对象晋升老年代的实际阈值, 可以使用参数 -XX:+PrintTenuringDistribution

如果需要查看GC与实际程序相互执行的耗时, 可以使用 -XX:+PrintGCApplicationt-StoppedTime 和 -XX:+PrintGCApplicationConcurrentTime参数。

可以使用 -Xloggc 参数指定GC日志的输出位置。 如 -Xloggc:C:\gc.log

5. 类和对象跟踪

-XX:+TraceClassLoading 参数用于跟踪类加载情况

-XX:+TraceClassUnloading 用于跟踪类卸载情况。

除了类的跟踪, JVM 还提供了 -XX:+PrintClassHistogram 开关用于打印运行时实例的信息。 当此开关被打开时,  当Ctrl+Break 被按下, 会输出系统内类的统计信息。

6. 控制GC

-XX:+DisableExplicitGC 选项用于禁止显式的GC操作, 即禁止在程序中使用System.gc() 触发Full GC.

-Xnoclassgc 参数, 不回收类, 进而提升GC的性能。

-Xincgc, 一旦启用这个参数,系统便会进行增量式的 GC. 增量式的GC使用特定算法让GC线程和应用程序线程交叉执行,从而减小应用程序因GC而产生的停顿时间。

7. 选择类校验器

在JDK1.6中默认开启新的类校验器,加速类的记载, 可以使用 -XX:-UseSplitVerifier参数指定使用旧的类校验器。

如果新的校验器校验失败,可以使用老的校验器再次校验。可以使用开关 -XX:-FailOverToOldVerifier关闭再次校验的功能

8. Solaris 下线程控制

在 Solaris 下, JVM提供了几个用于线程控制的开关

-XX:+UseBoundTreads: 绑定所有用户线程到内核线程, 减少线程进入饥饿状态的次数

-XX:+UserLWPSynchronization: 使用内核线程替换线程同步

-XX:+UserVMInterruptibleIO: 运行运行时中断线程。

9.. 使用大页

对同样大小的内存空间, 使用大页后, 内存分页的表现就会减少, 从而可以提升CPU从虚拟内存地址映射到物理内存地址的能力。 在支持大页的操作系统中,使用JVM参数让虚拟机使用大页,从而提升系统性能。

-XX:+UserlargePages: 启用大页

-XX:LargePageSizeInBytes: 指定大页的大小

10. 压缩指针

在64位虚拟机上, 应用程序所占内存的大小要远远超出其32位版本(约1.5 倍左右)。这是因为64位系统拥有更宽的寻址空间, 与32位系统相比,指针对象的长度进行了翻倍。为了解决这个问题,

64位的JVM虚拟机可以使用 -XX:+UseCompressedOops参数打开指针压缩,从一定程度上减少内存的消耗,可以对以下指针进行压缩:

Class的属性指针

对象的属性指针

普通对象数组的每个元素指针

实战JVM调优

Tomcat 启动加速

使用 startup.bat 启动Tomcat 服务器时, start.bat  调用了bin 目录下的calalina.bat 文件。

设置环境变量CATALINA_OPTS 或者JAVA_OPTS都可以设置tomcat  的JVM优化参数。

set CATALINA_OPTS=-Xloggc:gc.log -XX:+PrintGCDetails

为了减少Minor GC的次数, 增大新生代

set CATALINA_OPTS=%CATALINA_OPTS% -Xmx32M -Xms32M

禁用显示GC

set CATALINA_OPTS=%CATALINA_OPTS% -XX:+DisableExplicitGC

在堆内存不变的前提下,为了能进一步减少Minor GC的次数,可以扩大新生代的大小

set CATALINA_OPTS=%CATALINA_OPTS% -XX:NewRation=2

为了加快Minor GC的速度,在多核计算机上可以考虑使用新生代并行回收收集器,加快Minor GC 的速度

set CATALINA_OPTS=%CATALINA_OPTS% -XX:+UseParallelGC

由于JVM虚拟机在加载类时,处于完全考虑,会对Class进行校验和认证,如果类文件是可信任的, 为了加快程序的运行速度,也可以考虑禁用这些效应:

set CATALINA_OPTS=%CATALINA_OPTS% -Xverify:none

JMeter介绍和使用

JMeter是Apache 下基于Java 的一款性能测试和压力测试工具。它基于Java 开发,可对HTTP 服务器和FTP服务器,甚至是数据库进行压力测试。

线程组将模拟用户线程访问Tomcat 服务器。

在线程组之下,需要给线程组分配相应的采样器, 比如HTTP请求, FTP请求,数据库连接等。

除线程组和采样器外,最后还需要一份测试报告。JMeter可以给出各种形式或侧重于各个方面的测试报告。

调优前:

从以上图中可以看到, 最大堆为 256MB, 但在实际使用中, 只使用了50MB.因此, 引起了频繁的GC.

在永久区,最大为64MB,而实际使用时,初始值约在10MB左右,并经历一次扩容,达到19MB左右,基本稳定在19MB.

调优过程

为了减少GC次数, 可以使用合理的堆大小和永久区大小。这里将堆大小设置为512MB, 永久区使用32MB, 同时, 禁用显示GC, 并去掉类校验。参数如下:

set CATALINA_OPTS=%CATALINA_OPTS% "-Xmx512M"
set CATALINA_OPTS=%CATALINA_OPTS% "-Xms512M"
set CATALINA_OPTS=%CATALINA_OPTS% "-XX:PermSize=32M"
set CATALINA_OPTS=%CATALINA_OPTS% "-XX:MaxPermSize=32M"
set CATALINA_OPTS=%CATALINA_OPTS% "-XX:+DisableExplicitGC"
set CATALINA_OPTS=%CATALINA_OPTS% "-Xverify:none"

为了进一步提高系统的吞吐量, 可以尝试使用并行回收收集器代替串行收集器。

set CATALINA_OPTS=%CATALINA_OPTS% "-Xmx512M"
set CATALINA_OPTS=%CATALINA_OPTS% "-Xms512M"
set CATALINA_OPTS=%CATALINA_OPTS% "-XX:PermSize=32M"
set CATALINA_OPTS=%CATALINA_OPTS% "-XX:MaxPermSize=32M"
set CATALINA_OPTS=%CATALINA_OPTS% "-XX:+DisableExplicitGC"
set CATALINA_OPTS=%CATALINA_OPTS% "-Xverify:none"
set CATALINA_OPTS=%CATALINA_OPTS% -XX:+UseParallelGC
set CATALINA_OPTS=%CATALINA_OPTS% -XX:+UseParallelOldGC
set CATALINA_OPTS=%CATALINA_OPTS% -XX:ParallelGCThreads=8

总结一下: JVM调优的主要过程有:

确定堆内存大小(-Xmx, -Xms)

合理分配新生代和老生代(-XX:NewRation, -Xmn, -XX:SurvivorRatio)

确定永久区大小: -XX:Permsize, -XX:MaxPermSize

选择垃圾收集器

对垃圾收集器进行合理的设置

除此之外,禁用显示GC(-XX:+DisableExplicitGC), 禁用类元数据回收(-Xnoclassgc), 禁用类验证(-Xverfy:none)等设置, 对提升系统性能也有一定的帮助。

Java 性能优化系列之3.2[JVM调优]相关推荐

  1. Java 性能优化系列之3.1[JVM调优]

    Java 虚拟机内存模型 JVM 虚拟机将其内存数据分为程序计数器.虚拟机栈.本地方法栈.Java 堆和方法区等部分. 程序计数器用于存放下一条运行的指令:虚拟机栈和本地方法栈用于存放函数调用栈信息: ...

  2. Java 性能优化系列之3.2[JVM调优] --- JIT即时编译

    参考:http://blog.csdn.net/oscar999/article/details/47271531            http://taogebx.iteye.com/blog/9 ...

  3. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  4. Java 性能优化系列之1[设计与程序优化]

    性能 一般来说,性能通过以下几个方面来表现: 执行速度 内存分配 启动时间 负载承受能力 定量评测的性能指标: 执行时间 CPU时间 内存分配 磁盘吞吐量 网络吞吐量 响应时间 调优的层面 设计调优 ...

  5. JVM 调优系列 1:“精通 JVM 调优,有过 JVM 调优经验”,简历敢写吗?薪资涨 5k 的技巧!

    文章目录 前言 一.部分大厂对于 JVM GC 的面试题 1.1.百度 1.2.顺丰 1.3.京东 1.4.淘宝 1.5.阿里.蘑菇街 二.Garbage Collectors(GC)作何使用 三.G ...

  6. spark算子_Spark 性能优化(四)——程序开发调优

    1.4 程序开发调优 Spark 性能优化的第一步,就是要在开发 Spark 作业的过程中注意和应用一些性能优化的基本原则.开发调优,就是要让大家了解以下一些 Spark 基本开发原则,包括:RDD ...

  7. 15天的性能优化工作,5方面的调优经验

    开心一笑 世界上最互相信任的两个人应该是初中老师和高中老师了. 初中老师:这个知识点到高中你们老师会讲的,你们现在不必要知道. 高中老师:这个知识点你们初中老师肯定讲过了,我就不讲了. 我:你TM在逗 ...

  8. 【SQL性能优化】当我们思考数据库调优的时候,都有哪些维度可以选择?

    文章目录 数据库调优的目标 用户的反馈 日志分析 服务器资源使用监控 数据库内部状况监控 对数据库进行调优,都有哪些维度可以进行选择? 第一步,选择适合的 DBMS 第二步,优化表设计 第三步,优化逻 ...

  9. Java 性能优化之—— JIT 如何影响 JVM 的性能

    Java 虚拟机栈,其实是一个双层的栈,如下图所示,第一层就是针对 method 的栈帧,第二层是针对字节码指令的操作数栈 栈帧的创建是需要耗费资源的,尤其是对于 Java 中常见的 getter.s ...

最新文章

  1. java 连接池_初探数据库连接池
  2. 【五线谱】拍号与音符时值 ( 全音符 | 二分音符 | 四分音符 | 八分音符 | 十六分音符 | 三十二分音符 )
  3. 20155335 俞昆 第十周作业
  4. 【级数】【马尔科夫链】n乘以x的n次方的和函数
  5. 牛客-Forsaken喜欢独一无二的树【并查集,最小生成树】
  6. SQLHelper帮助类
  7. ubuntu14.04安装git
  8. 不小心合并了icloud通讯录_苹果手机怎么恢复通讯录联系人号码?原来方法竟如此简单!...
  9. Algorithms Part 1-Question 5- Dijkstra's shortest-path-最短路径算法
  10. Ubuntu18.04搭建Web服务器
  11. 新车入手,美利达公爵500
  12. ASP.NET 文件操作类
  13. linux登录闪回登录界面,两种闪回查询的使用实验
  14. poj2976(二分搜索,最大化平均值)
  15. ubuntu安装visio2010_ubuntu 一个Linux脚本搞定常用软件的安装
  16. 二叉树遍历的几种常见方法
  17. Android 实现远程控制(类似QQ的远程协助)
  18. 用XOM编写GraphML?
  19. 招银网络---C++
  20. python贺卡编程_一种卡片编程机及其编程方法与流程

热门文章

  1. Jmeter(七)Jmeter脚本优化(数据与脚本分离)
  2. 06002_Redis概述
  3. grafana-----Time Range Controls
  4. 判断当前是否运行于Design Mode
  5. Comet服务器推送与SignalR
  6. Oracle无法使用EM解决方案
  7. 【报告分享】2021年中国新经济企业500强发展研究报告.pdf(附下载链接)
  8. “进化”的搜索方式:揭秘微软语义搜索背后的技术
  9. 【报告分享】2019中国青年理想城报告(含城市青和力TOP100).pdf
  10. 【榜首团队专访】冲刺复赛,他们有绝招