概述


公司的江南白衣写了一篇关键业务系统的JVM参数推荐(2016热冬版)的文章,大牛的文章总是需要细细品读。这篇文章介绍大量的JVM调优参数,内容也比较多,本文只是列出我自己能理解的一些参数,暂时理解不了的参数就只能等以后自己实力到家了,再慢慢补充上来。

性能调优参数


-XX:AutoBoxCacheMax

JAVA进程启动的时候,会加载rt.jar这个核心包,rt.jar包里的Integer自然也会被加载到JVM中,Integer里面有一个IntegerCache缓存,如下:

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {}
}

IntegerCache有一个静态代码块,JVM在加载Integer这个类时,会优先加载静态的代码。当JVM进程启动完毕后, -128 ~ +127 范围的数字会被缓存起来,调用valueOf方法的时候,如果是这个范围内的数字,则直接从缓存取出。
超过这个范围的,就只能构造新的Integer对象了。

public static Integer valueOf(int i) {assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}

因此可以根据实际情况把AutoBoxCacheMax的值设置的大些,比如江南白衣推荐的

-XX:AutoBoxCacheMax=20000

-XX:+AlwaysPreTouch

JAVA进程启动的时候,虽然我们可以为JVM指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是等JVM访问这些内存的时候,才真正分配,这样会造成以下问题。
1、GC的时候,新生代的对象要晋升到老年代的时候,需要内存,这个时候操作系统才真正分配内存,这样就会加大young gc的停顿时间;
2、可能存在内存碎片的问题。

可以在JVM启动的时候,配置

-XX:+AlwaysPreTouch

参数,这样JVM就会先访问所有分配给它的内存,让操作系统把内存真正的分配给JVM,后续JVM就可以顺畅的访问内存了。

GC参数


JAVA 1.7用的垃圾收集算法还是CMS,下文提到的参数都是针对CMS的。

CMSInitiatingOccupancyFraction

之前写过一篇java垃圾回收算法之-CMS(并发标记清除),里面提到垃圾收集线程会跟应用的线程一起并行的工作,万一垃圾收集线程在工作的时候,老年代内存不足怎么办?因此最好还是提前启动CMS来收集垃圾(CMS GC)。
可以通过设置

CMSInitiatingOccupancyFraction=75

那么当老年代堆空间的使用率达到75%的时候就开始执行垃圾回收,CMSInitiatingOccupancyFraction默认值是92%,这个就太大了。
CMSInitiatingOccupancyFraction参数必须跟下面两个参数一起使用才能生效的。

-XX:+UseConcMarkSweepGC
-XX:+UseCMSInitiatingOccupancyOnly

MaxTenuringThreshold

新生代是使用copy算法来进行垃圾回收的,可以参看

java垃圾回收算法之-coping复制

默认情况下,当新生代执行了15次young gc后,如果还有对象存活在Survivor区中,那么就可以直接将这些对象晋升到老年代,但是由于新生代使用copy算法,如果Survivor区存活的对象太久的话,Survivor区存活的对象就越多,这个就会影响copy算法的性能,使得young gc停顿的时间加长,建议设置成6。

-XX:MaxTenuringThreshold=6

ExplicitGCInvokesConcurrent

如果系统使用堆外内存,比如用到了Netty的DirectByteBuffer类,那么当想回收堆外内存的时候,需要调用

System.gc()

而这个方法将进行full gc,整个应用将会停顿,如果是使用CMS垃圾收集器,那么可以设置

-XX:+ExplicitGCInvokesConcurrent

这个参数来改变System.gc()的行为,让其从full gc --> CMS GC,CMS GC是并发收集的,且中间执行的过程中,只有部分阶段需要stop the world。

注意:设置了ExplicitGCInvokesConcurrent,那就不要设置DisableExplicitGC参数来禁掉System.gc()

内存参数


-Xmx, -Xms

这两个一般都是设置4个g

NewRatio

GC最多的还是发生在新生代的young gc,所以可以提高一下新生代在整个堆的占用比例,建议设置为对半分,尽量避免young gc

-XX:NewRatio=1

JVM 调优(学习篇)相关推荐

  1. JVM调优理论篇_二、常用垃圾回收器(JVM10种垃圾回收器)以及垃圾回收算法

    JVM调优理论篇_二.常用垃圾回收器以及垃圾回收算法 前言 一.垃圾回收基础 1.什么场景下使用垃圾回收 2.垃圾回收发生在哪个区域? 3.对象在什么情况下会被回收?(如何判断一个对象是否该被回收) ...

  2. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  3. Jvm 系列(七):Jvm 调优-工具篇

    工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题 ...

  4. jvm系列(四):jvm调优-命令篇

    运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...

  5. jvm相关,垃圾收集算法,垃圾收集器,jvm调优--学习笔记

    对内存合理分配,优化jvm 参数,就是为了尽可能减少新生代(Minor GC),或者是整个老年代(Major GC) ,或者是整个 Java 堆 (Full GC) ,尽量减少 GC 带来的系统停顿, ...

  6. JVM调优学习笔记整理

    1.相关基础知识 1.1 JVM内存模型 参见blog:https://blog.csdn.net/lydon1314/article/details/120716778 网址:https://zhu ...

  7. 【JVM调优工具篇】使用JProfiler追踪GC Roots溯源

    1.首先启动程序(让程序一直保持运行状态) 2.启动JProfiler 3.打开对应的进程 4.Live memory->All Objects 5.右键->Use Selected Ob ...

  8. 【JVM调优工具篇】使用MAT工具分析dump文件(查看GC Roots)

    MAT下载地址:https://www.eclipse.org/mat/ 1.File->Open File->找到dump文件打开即可 2.Java Basics->GC Root ...

  9. 【JVM调优工具篇】jvisualvm工具导出dump文件教程

    1.首先启动程序(需确保程序一直在运行中) 2.打开JvisualVM工具 3.打开对应的程序进程 4.点击线程->线程dump 5.右键快照->另存为 6.结束

  10. JVM调优:运行参数,内存模型,mat、jps、jstat、jmap、jstack、jvisualvm工具的使用

    JVM调优 - 工具篇 作者:张学亮 讲解内容 了解下我们为什么要学习JVM优化 掌握jvm的运行参数以及参数的设置 掌握jvm的内存模型(堆内存) 掌握jamp命令的使用以及通过MAT工具进行分析 ...

最新文章

  1. Python 字典的 使用
  2. Bootstrap4 .ml-auto元素居右.mr-auto元素居左
  3. 表弟:这数学规律题该怎么解决呢?使用Python你会发现很简单
  4. Linux系统安全学习手册
  5. .net框架读书笔记---基础类型
  6. Deep learning with Python 学习笔记(9)
  7. webapi随机调用_BeetleX之webapi验证插件JWT集成
  8. ThinkPHP5访问去除/public/index.php
  9. 如何在windows下安装Python(Python入门教程)
  10. C++语言程序设计第五版 - 郑莉-绪论(一)
  11. Qt error LNK2001: unresolved external symbol
  12. 用python编写一个汉诺塔的移动函数_关于python递归函数实现汉诺塔
  13. Android Studio Design界面不显示layout控件的解决方法
  14. C++STL优先队列小根堆大根堆自定义的应用
  15. js,JQ 图片转换base64 base64转换为file对象,blob对象
  16. java小算盘金钱存银行1秒算出每一年的利息及存款,利息一目了然
  17. 高德地图正确食用方法(持续更新)
  18. 【100%通过率】华为OD机试真题 C++ 实现【猜字谜】【2022.11 Q4 新题】
  19. RK3288平台 SPI接口调试步骤
  20. python 股票 实例-python-面向对象(股票对象举例)

热门文章

  1. UiBot新版本即将上线!添加Java程序支持!
  2. 解决服务器上安装不了centos7.4的问题
  3. c++ primer 5th 笔记:第二章
  4. OCR磁盘的导出和导入、备份和恢复以及移动(ocrconfig命令的应用)
  5. Skype for Business Server 2015-10-ADFS-2-配置
  6. 防止程序启动两次的方法CreateMutex()
  7. 点亮Web的灯---silverlight
  8. 基于Spatial CNN的车道线检测和交通场景理解
  9. 双网卡服务器SOCKET编程指定客户端通信网卡
  10. C++调用WebService