java jvm 参数ITeyeguojizaixian - 娱乐之横扫全球

java jvm 参数ITeyeguojizaixian

2019-02-07 09:45:59 | 作者: 振荣 | 标签: 设置,内存,参数 | 浏览: 7329


java jvm 参数 -Xms -Xmx -Xmn -Xss 调优总结常见装备举例
https://hi.baidu.com/sdausea/item/f4671be89a7ec40d570f1d2d
堆巨细设置
JVM 中最大堆巨细有三方面约束:相关操作体系的数据模型(32-bt仍是64-bit)约束;体系的可用虚拟内存约束;体系的可用物理内存约束.32位体系 下,一般约束在1.5G~2G;64为操作体系对内存无约束.我在Windows Server 2003 体系,3.5G物理内存,JDK5.0下测验,最大可设置为1478m.
典型设置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:设置JVM最大可用内存为3550M.
-Xms3550m:设置JVM促进内存为3550m.此值能够设置与-Xmx相同,以防止每次废物收回完结后JVM重新分配内存.
-Xmn2g:设置年青代巨细为2G.整个堆巨细=年青代巨细 + 年迈代巨细 + 耐久代巨细.耐久代一般固定巨细为64m,所以增大年青代后,将会减小年迈代巨细.此值对体系功能影响较大,Sun官方引荐装备为整个堆的3/8.
-Xss128k: 设置每个线程的仓库巨细.JDK5.0今后每个线程仓库巨细为1M,曾经每个线程仓库巨细为256K.更具运用的线程所需内存巨细进行 调整.在相同物理内存下,减小这个值能生成更多的线程.可是操作体系对一个进程内的线程数仍是有约束的,不能无限生成,经验值在3000~5000左右.

java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:设置年青代(包含Eden和两个Survivor区)与年迈代的比值(除掉耐久代).设置为4,则年青代与年迈代所占比值为1:4,年青代占整个仓库的1/5
-XX:SurvivorRatio=4:设置年青代中Eden区与Survivor区的巨细比值.设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年青代的1/6
-XX:MaxPermSize=16m:设置耐久代巨细为16m.
-XX:MaxTenuringThreshold=0: 设置废物最大年纪.假如设置为0的话,则年青代方针不通过Survivor区,直接进入年迈代. 关于年迈代比较多的运用,能够进步功率.假如将此值设置为一个较大值,则年青代方针会在Survivor区进行屡次仿制,这样能够添加方针再年青代的存活 时刻,添加在年青代即被收回的概论.
收回器挑选
JVM给了三种挑选:串行搜集器,并行搜集器,并发搜集器,可是串行搜集器只适用于小数据 量的状况,所以这儿的挑选首要针对并行搜集器和并发搜集器.默许 状况下,JDK5.0曾经都是运用串行搜集器,假如想运用其他搜集器需求在发动时参加相应参数.JDK5.0今后,JVM会依据当时体系装备进行判别.
吞吐量优先的并行搜集器
如上文所述,并行搜集器首要以抵达必定的吞吐量为方针,适用于科学技术和后台处理等.
典型装备:
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
-XX:+UseParallelGC:挑选废物搜集器为并行搜集器.此装备仅对年青代有用.即上述装备下,年青代运用并发搜集,而年迈代依旧运用串行搜集.
-XX:ParallelGCThreads=20:装备并行搜集器的线程数,即:一同多少个线程一同进行废物收回.此值最好装备与处理器数目持平.

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-XX:+UseParallelOldGC:装备年迈代废物搜集办法为并行搜集.JDK6.0支撑对年迈代并行搜集.

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=100:设置每次年青代废物收回的最长时刻,假如无法满意此刻刻,JVM会主动调整年青代巨细,以满意此值.

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行搜集器会主动挑选年青代区巨细和相应的Survivor区份额,以抵达方针体系规则的最低相应时刻或许搜集频率等,此值主张运用并行搜集器时,一向翻开.

呼应时刻优先的并发搜集器
如上文所述,并发搜集器首要是确保体系的呼应时刻,削减废物搜集时的中止时刻.适用于运用服务器,电信范畴等.
典型装备:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC:设置年迈代为并发搜集.测验中装备这个今后,-XX:NewRatio=4的装备失效了,原因不明.所以,此刻年青代巨细最好用-Xmn设置.
-XX:+UseParNewGC:设置年青代为并行搜集.可与CMS搜集一同运用.JDK5.0以上,JVM会依据体系装备自行设置,所以无需再设置此值.
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction:由于并发搜集器不对内存空间进行紧缩,收拾,所以运转一段时刻今后会发作"碎片",使得运转功率下降.此值设置运转多少次GC今后对内存空间进行紧缩,收拾.
-XX:+UseCMSCompactAtFullCollection:翻开对年迈代的紧缩.或许会影响功能,可是能够消除碎片

辅佐信息
JVM供给了许多命令行参数,打印信息,供调试运用.首要有以下一些:
-XX:+PrintGC
输出办法:[GC 118250K- 113543K(130112K), 0.0094143 secs]
[Full GC 121376K- 10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails
输出办法:[GC [DefNew: 8614K- 781K(9088K), 0.0123035 secs] 118250K- 113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K- 8614K(9088K), 0.0000665 secs][Tenured: 112761K- 10414K(121024K), 0.0433488 secs] 121376K- 10414K(130112K), 0.0436268 secs]

-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合运用
输出办法:11.851: [GC 98328K- 93620K(130112K), 0.0082960 secs]

-XX:+PrintGCApplicationConcurrentTime:打印每次废物收回前,程序未中止的执行时刻.可与上面混合运用
输出办法:Application time: 0.5291524 seconds

-XX:+PrintGCApplicationStoppedTime:打印废物收回期间程序暂停的时刻.可与上面混合运用
输出办法:Total time for which application threads were stopped: 0.0468229 seconds

-XX:PrintHeapAtGC:打印GC前后的详细仓库信息
输出办法:
34.702: [GC {Heap before gc invocations=7:
def new generation total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000)
to space 6144K, 0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
tenured generation total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)
the space 69632K, 3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
34.735: [DefNew: 52568K- 3433K(55296K), 0.0072126 secs] 55264K- 6615K(124928K)Heap after gc invocations=8:
def new generation total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)
eden space 49152K, 0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000)
from space 6144K, 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)
to space 6144K, 0% used [0x221d0000, 0x221d0000, 0x227d0000)
tenured generation total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)
the space 69632K, 4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
}
, 0.0757599 secs]

-Xloggc:filename:与上面几个合作运用,把相关日志信息记录到文件以便剖析.
常见装备汇总
堆设置
-Xms:初始堆巨细
-Xmx:最大堆巨细
-XX:NewSize=n:设置年青代巨细
-XX:NewRatio=n:设置年青代和年迈代的比值.如:为3,表明年青代与年迈代比值为1:3,年青代占整个年青代年迈代和的1/4
-XX:SurvivorRatio=n:年青代中Eden区与两个Survivor区的比值.留意Survivor区有两个.如:3,表明Eden:Survivor=3:2,一个Survivor区占整个年青代的1/5
-XX:MaxPermSize=n:设置耐久代巨细
搜集器设置
-XX:+UseSerialGC:设置串行搜集器
-XX:+UseParallelGC:设置并行搜集器
-XX:+UseParalledlOldGC:设置并行年迈代搜集器
-XX:+UseConcMarkSweepGC:设置并发搜集器
废物收回计算信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行搜集器设置
-XX:ParallelGCThreads=n:设置并行搜集器搜集时运用的CPU数.并行搜集线程数.
-XX:MaxGCPauseMillis=n:设置并行搜集最大暂停时刻
-XX:GCTimeRatio=n:设置废物收回时刻占程序运转时刻的百分比.公式为1/(1+n)
并发搜集器设置
-XX:+CMSIncrementalMode:设置为增量形式.适用于单CPU状况.
-XX:ParallelGCThreads=n:设置并发搜集器年青代搜集办法为并行搜集时,运用的CPU数.并行搜集线程数.

调优总结
年青代巨细挑选
呼应时刻优先的运用:尽或许设大,直到挨近体系的最低呼应时刻约束(依据实践状况挑选).在此种状况下,年青代搜集发作的频率也是最小的.一同,削减抵达年迈代的方针.
吞吐量优先的运用:尽或许的设置大,或许抵达Gbit的程度.由于对呼应时刻没有要求,废物搜集能够并行进行,一般合适8CPU以上的运用.
年迈代巨细挑选
响 应时刻优先的运用:年迈代运用并发搜集器,所以其巨细需求当心设置,一般要考虑并发会话率和会话持续时刻等一些参数.假如堆设置小了,能够会形成内存碎 片,高收回频率以及运用暂停而运用传统的符号铲除办法;假如堆大了,则需求较长的搜集时刻.最优化的计划,一般需求参阅以下数据取得:
并发废物搜集信息
耐久代并发搜集次数
传统GC信息
花在年青代和年迈代收回上的时刻份额
削减年青代和年迈代花费的时刻,一般会进步运用的功率

吞吐量优先的运用:一般吞吐量优先的运用都有一个很大的年青代和一个较小的年迈代.原因是,这样能够尽或许收回掉大部分短期方针,削减中期的方针,而年迈代尽寄存长时刻存活方针.
较小堆引起的碎片问题
因 为年迈代的并发搜集器运用符号,铲除算法,所以不会对堆进行紧缩.当搜集器收回时,他会把相邻的空间进行兼并,这样能够分配给较大的方针.可是,当堆空 间较小时,运转一段时刻今后,就会呈现"碎片",假如并发搜集器找不到满足的空间,那么并发搜集器将会中止,然后运用传统的符号,铲除办法进行收回.假如 呈现"碎片",或许需求进行如下装备:
-XX:+UseCMSCompactAtFullCollection:运用并发搜集器时,敞开对年迈代的紧缩.
-XX:CMSFullGCsBeforeCompaction=0:上面装备敞开的状况下,这儿设置多少次Full GC后,对年迈代进行紧缩

在 同一个工程下,有两个类,这两个类中只要很少的变化,而最关健的FOR却没有一点变化,可是当我别离运转这两个程序的时分却呈现一个很严重的问题,一个程 序循环的快,一个循环的慢.这到底是怎么回事呢~???苦苦寻找了半响也没有想到是为什么,由于程序改动的部分根不影响我循环的速度,可是成果却是有很大 的不同,一个大约是在一分钟这内就能够循环完,可是另一个却需求六七分钟,这根本就不是一个数据理级的麻.两个彻底相同的循环,从代码上根本上是看不出有 什么问题.不得以求助搭档吧,可是搭档看了也感觉很怪异,两个人在那订着代码又看了一个多小时,最终搭档让我来个洁净点的,关机重启.我到也听话,就顺着 搭档的意思去了,可就在关机的这个时分他俄然说是不是内存的问题,我也空然想到了,还真的有或许是内存的问题,由于快的那个在我之前运转程序之前可给过 1G的内存啊,而后来的这个我好像是没有设过内存啊,机器起来了,有了这个主意进去看看吧,成果正中要害,果真是慢的那个没有开内存,程序运转时只不过是 JVM默许开的内存.我开始剖析是由于内存太小,而我的程序所用内存又正好卡在JVM所开内存边上,不至于溢出.当程序运转时就得花费大部分时刻去调用 GC去,这样就导致了为什么相同的循环呈现两种不同的功率~!
顺便把内存运用状况的办法也贴出来:
public static String getMemUsage() {
long free = java.lang.Runtime.getRuntime().freeMemory();
long total = java.lang.Runtime.getRuntime().totalMemory();
StringBuffer buf = new StringBuffer();
buf.append("[Mem: used ").append((total-free) 20)
.append("M free ").append(free 20)
.append("M total ").append(total 20).append("M]");
return buf.toString();
}

google一下,大约就说JVM是这样来操作内存:
堆(Heap)和非堆(Non-heap)内存
按 照官方的说法:"Java 虚拟机具有一个堆,堆是运转时数据区域,一切类实例和数组的内存均从此处分配.堆是在 Java 虚拟机发动时创立的.""在JVM中堆之外的内存称为非堆内存(Non-heap memory)".能够看出JVM首要办理两品种型的内存:堆和非堆.简略来说堆就是Java代码可及的内存,是留给开发人员运用的;非堆就是JVM留给 自己用的,所以办法区,JVM内部处理或优化所需的内存(如JIT编译后的代码缓存),每个类结构(如运转时常数池,字段和办法数据)以及办法和结构办法 的代码都在非堆内存中.
堆内存分配
JVM初始分配的内存由-Xms指定,默许是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默许是物理内存的1/4.默许空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大约束;空余堆内存大于70%时, JVM会削减堆直到-Xms的最小约束.因而服务器一般设置-Xms,-Xmx持平以防止在每次GC 后调整堆的巨细.
非堆内存分配
JVM运用-XX:PermSize设置非堆内存初始值,默许是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的巨细,默许是物理内存的1/4.
JVM内存约束(最大值)
首 先JVM内存首要受限于实践的最大物理内存,假定物理内存无限大的话,JVM内存的最大值跟操作体系有很大的联系.简略的说就32位处理器尽管可控内存空 间有4GB,可是详细的操作体系会给一个约束,这个约束一般是 2GB-3GB(一般来说Windows体系下为1.5G-2G,Linux体系下为2G-3G),而64bit以上的处理器就不会有约束了
JVM内存的调优
1. Heap设定与废物收回Java Heap分为3个区,Young,Old和Permanent.Young保存刚实例化的方针.当该区被填满时,GC会将方针移到Old 区.Permanent区则担任保存反射方针,本文不评论该区.JVM的Heap分配能够运用-X参数设定,
-Xms
初始Heap巨细
-Xmx
java heap最大值
-Xmn
young generation的heap巨细
JVM有2个GC线程.第一个线程担任收回Heap的Young区.第二个线程在Heap缺乏时,遍历Heap,将Young 区晋级为Older区.Older区的巨细等于-Xmx减去-Xmn,不能将-Xms的值设的过大,由于第二个线程被逼运转会下降JVM的功能.
为什么一些程序频频发作GC?有如下原因:
l 程序内调用了System.gc()或Runtime.gc().
l 一些中间件软件调用自己的GC办法,此刻需求设置参数制止这些GC.
l Java的Heap太小,一般默许的Heap值都很小.
l 频频实例化方针,Release方针.此刻尽量保存并重用方针,例如运用StringBuffer()和String().
假如你发现每次GC后,Heap的剩下空间会是总空间的50%,这表明你的Heap处于健康状况.许多Server端的Java程序每次GC后最好能有65%的剩下空间.经验之谈:
1.Server端JVM最好将-Xms和-Xmx设为相同值.为了优化GC,最好让-Xmn值约等于-Xmx的1/3[2].
2.一个GUI程序最好是每10到20秒间运转一次GC,每次在半秒之内完结[2].
留意:
1.添加Heap的巨细尽管会下降GC的频率,但也添加了每次GC的时刻.而且GC运转时,一切的用户线程将暂停,也就是GC期间,Java运用程序不做任何作业.
2.Heap巨细并不决议进程的内存运用量.进程的内存运用量要大于-Xmx界说的值,由于Java为其他任务分配内存,例如每个线程的Stack等.
2.Stack的设定
每个线程都有他自己的Stack.
-Xss
每个线程的Stack巨细
Stack的巨细约束着线程的数量.假如Stack过大就好导致内存溢漏.-Xss参数决议Stack巨细,例如-Xss1024K.假如Stack太小,也会导致Stack溢漏.
3.硬件环境
硬件环境也影响GC的功率,例如机器的品种,内存,swap空间,和CPU的数量.
假如你的程序需求频频创立许多transient方针,会导致JVM频频GC.这种状况你能够添加机器的内存,来削减Swap空间的运用[2].
4.4种GC
第一种为单线程GC,也是默许的GC.,该GC适用于单CPU机器.
第二种为Throughput GC,是多线程的GC,适用于多CPU,运用许多线程的程序.第二种GC与第一种GC类似,不同在于GC在搜集Young区是多线程的,但在Old区和第一种相同,依然选用单线程.-XX:+UseParallelGC参数发动该GC.
第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC形成程序阻滞的时刻.这种GC能够在Old区的收回一同,运转运用程序.-XX:+UseConcMarkSweepGC参数发动该GC.
第四种为Incremental Low Pause GC,适用于要求缩短因GC形成程序阻滞的时刻.这种GC能够在Young区收回的一同,收回一部分Old区方针.-Xincgc参数发动该GC.
4种GC的详细描绘拜见[3].
参阅文章:
1. JVM Tuning. https://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp#garbage-collection
2. Performance tuning Java: Tuning steps
https://h21007.www2.hp.com/dspp/tech/tech_TechDocumentDetailPage_IDX/1,1701,1604,00.html
3. Tuning Garbage Collection with the 1.4.2 JavaTM Virtual Machine .
https://java.sun.com/docs/hotspot/gc1.4.2/
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章