JVM 参数学习

Stella981
• 阅读 654

一、JVM

1、JVM产生GC的位置

Eden(新生代) Minor GC 算法(复制)

Old tenure(老年代) Major(Full) GC (整理-压缩)算法

2、JVM 堆(Heap)内存大小参数

-Xmn 新生代 8:1:1比例

-Xms 设置初始化堆内存大小 
-Xmx 设置堆内存最大大小 

产生java.lang.OutOfMemoryError: Java heap space Heap size 的位置

异常原因:

经过Minor GC、Full GC、对象依然不能被回收,而堆内存不够就会发生该异常。

JDK 1.7

-XX:PermSize 永久代初始大小 默认是物理内存的1/64

-XX:MaxPermSize 永久代最大大小 默认是物理内存的1/4

产生java.lang.OutOfMemoryError: PermGen space 的位置

异常原因:

由于永久代是不会被GC(Garbage Collection) 回收的,只有在退出JVM时才会被回收

当过多的使用类库,永久代内存大小无法容纳更多的数据就会产生该异常。

JDK 1.8

永久代 -->元空间(MetaSpace)

-XX:MetaSpaceSize=128m

-XX:MaxMetaspaceSize=128m

-XX:+PrintGCDetails 打印GC

二、Tomcat 优化参数,基于JDK1.7

2、Tomcat JVM 参数

export JAVA_OPTS="-server -Xms512m -Xmx512m -Xss512k "

1、-server

启用JDK的Server版

tomcat 默认是以java -client的模式运行的,server既意味着你的tomcat是以真实的生产模式允许的

也就意味着你的tomcat有更大,更高的并发能力,更好的JVM垃圾回收机制,可以获得更多的负载与吞吐量

2、-Xms512m -Xmx512m

参考值物理内存的3/4(4分之3内存大小):如服务器内存1024M,则1024/4*3=768M

-Xmx JVM堆区最大内存(默认物理内存的1/4)

-Xms JVM堆区初始内存(默认物理内存的1/64)

建议大小配置相同,避免JVM内存大小的大起大落

默认JVM堆内存小于40%时,会调整到-Xmx,堆内存空闲内存大于70%时,会调整到-Xms

可以通过jmap 查看如下参数验证

Heap Configuration:

MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70

(不要使用32位的jdk,32位的最大内存只能配置到4G)

-Xmn 年轻代的堆内存大小,Eden+2 survivorspace(默认物理内存的1/64)

3、 -Xss512k

-Xss 设置每个线程的栈大小(默认大小1M),一般不要超过1M,不然容易出现out of memory

建议配置512k,

4、 -XX:+AggressiveOpts

将JDK优化版后的新特性自动注入,自我优化,自适应配置

参考:http://blog.csdn.net/zhoutao198712/article/details/7842659

5、-XX:+UseBiasedLocking

开启偏向锁

启用一个优化了的线程锁,对于高并发访问很重要,太对的请求忙不过来,它自动优化

对于各自长短不一的请求,出现的阻塞排队现象,它自己优化

简单案例:银行办理业务,银行客服询问业务,取钱业务A窗口,办卡业务B窗口,其他业务C窗口

参考:http://blog.163.com/silver9886@126/blog/static/35971862201472274958280/

6、-XX:PermSize=128M -XX:MaxPermSize=256M

-XX:PermSize 永久代初始大小

-XX:MaxPermSize 最大大小

根据自己实际情况进行配置,三方类库jar包大小,不需要多大

7、-XX:MaxNewSize

不建议配置的参数

-XX:MaxNewSize 设置最大的年轻代大小(默认16M)

-XX:NewSize 设置年轻代大小

8、-XX:+DisableExplicitGC

忽略手动调用System.gc(),使得手动的System.gc()变成一个空调用

完全不建议使用手工调用System.gc(),可能会引发各种为题

如果确认工程中没有此类代码,可以不做配置,建议配置

9、-XX:MaxTenuringThreshold=15

-XX:MaxTenuringThreshold 设置对象在新生代中经过多少次Minor GC 才进入老年代(默认15)

(1)、如果设置为0的话,则新生代对象不经过survivor区直接进入老年代,对于老年代比较多的应用可以提高效率

(2)、如果此值设置较大,则年轻代对象会在survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代被回收的概率

(3)、这个值是根据本地监控得到的具体值

10、-XX:+UseConcMarkSweepGC
即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。
我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒
 添加该参数表示启动并发标识-清理(Mark-Sweep)回收器(CMS)  
11、-XX:+UseParNewGC

对年轻代采用多线程并行回收,这样收得快

12、-XX:+CMSParallelRemarkEnabled

在使用UseParNewGC 的情况下, 尽量减少mark 的时间,降低标记停顿

13、-XX:+UseCMSCompactAtFullCollection

在使用concurrent gc 的情况下, 防止 memoryfragmention, 
对live object 进行整理, 使 memory 碎片减少。

14、-XX:LargePageSizeInBytes

指定 Java heap的分页页面大小

参考:http://blog.csdn.net/chluknight/article/details/6689323

15、-XX:+UseFastAccessorMethods

get,set 方法转成本地代码

16、-XX:+UseCMSInitiatingOccupancyOnly

指示只有在 old generation 在使用了初始化的比例后concurrent collector 启动收集

17、-Djava.awt.headless=true

这个参数一般我们都是放到最后使用,这个参数的作用是这样的,有时候我们会在项目中使用一些图表工具

比如,jfreechart,用于在WEB网页输出gif/jpg等流

在Windows我们运行一般不会有什么问题,但是到了linux环境下,经常会遇到一个exception,导致你在linux环境下无法正常显示图片,加上这个参数可以避免这样的情况出现

参考文章:

http://breezylee.iteye.com/blog/2043056

http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html

点赞
收藏
评论区
推荐文章
秋招面试我去了拼多多,直接被问JVM&GC底层原理和算法,我吊打面试官
(https://shimo.im/docs/9GTP6XrJg9J88cJD/)JVM常用参数设置积累c堆的初始值,默认物理内存的1/64Xms:堆的最大值,默认物理内存的1/4Xmx:年轻代大小「在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8」X
Stella981 Stella981
2年前
JVM虚拟机调优实战(3)进阶调优篇
1.JVM内存分配与回收1.1MinorGc和FullGC有什么不同呢?   新生代GC(MinorGC):指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快。   老年代GC(MajorGC/FullGC):指发生在老年代的GC,出现了MajorGC经常会伴随至少一次的MinorGC(并非绝对)
Wesley13 Wesley13
2年前
Java虚拟机堆内存(新生代)
Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象。在Java中,堆被划分成两个不同的区域:新生代,老年代。新生代又被分为了三个区域:Eden,from survivor,tosurvivor。这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存分配以及回收。堆的内存模型大致为:从图中可以看出:堆大
Stella981 Stella981
2年前
JVM基本配置与调优
JVM基本配置与调优JVM调优,一般都是针对堆内存配置调优。如图:堆内存分新生代和老年代,新生代又划分为eden区、from区、to区。!(https://oscimg.oschina.net/oscnet/5b30ad2de1851315e10f5d9e0a57395208c.png)一、区域释义
Stella981 Stella981
2年前
JVM 调优
JVM堆内存分区堆:年轻代,老年代,持久代年轻代:Eden,Survivor1,Survivor2!一个性能较好的jvm参数配置以及jvm的简介(http://static.oschina.net/uploads/img/201601/13172230_Pd5L.jpg)GC新生代GC(Mino
Stella981 Stella981
2年前
JVM 参数说明(持续更新)
JVM常用参数说明参数名称默认值描述\Xms \Xms,JVM启动时申请的最小Heap内存大小,默认为物理内存的1/64但小于1G;\Xmx \Xmx,JVM启动时申请的最大Heap内存大小,默认为物理内存的1/4但小于1G\Xmn 指定新生代内存大小\
Stella981 Stella981
2年前
JVM笔记九
在上一篇文章中,我们通过代码运行结果,查看到JVM的堆内存逻辑上分区是三部分,物理上分区是2部分,以及是新生代分区三部分,占比分布是8/1/1。而且我们还通过代码和堆JVM参数配置,制造出了OOM异常。下面我们就来分析GC回收器的日志信息。先来看看,OOM后,GC详细日志信息:!dd604a3c4cda17304edcc43b03106d58.pn
Stella981 Stella981
2年前
JVM优化之
XmnXmsXmxXss有什么区别Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。\Xms堆内存的最小大小,默认为物理内存的1/64\Xmx堆内存的最大大小,默认为物理内存的1/4\Xmn堆内新生代的大小。通过这个值也可以得到老
Stella981 Stella981
2年前
JVM(7)之 从GC日志分析堆内存
在前面的文章中,我们只设置了整个堆的内存大小。但是我们知道,堆又分为了新生代,年老代。他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比例大小能改变吗?其实这些都是可控的,以前没有讲到是因为就算讲了也只是讲讲而已,看不到实质性的东西。因此这章我们通过分析GC日志来一步步讲解如何细化设置堆内存。   首先我们来了解几个相关的参数:
Stella981 Stella981
2年前
JVM常用命令参数
(1)Xms20M表示设置JVM启动内存的最小值为20M,必须以M为单位  m:memory(2)Xmx20M表示设置JVM启动内存的最大值为20M,必须以M为单位。将Xmx和Xms设置为一样可以避免JVM内存自动扩展。(3)verbose:gc表示输出虚拟机中GC的详细情况(4)Xss128k表示可以设置虚拟机栈的大