JVM中参数的设置

垃圾收集策略:
	垃圾收集的3种模式:
		Serial GC
			串行收集:适合内存有限的情况,回收慢。
		Parallel GC
			并行收集:效率高,当Heap较大时,系统暂停时间较长。
		CMS GC 
			并发收集:Old区回收暂停时间短,整个GC耗时较长、比较耗CPU资源。

	参数:
		Serial GC:
			-XX:+UseSerialGC 		使用串行收集模式,即使用Serail + Serail Old 进行回收。虚拟机运行在client模式下的默认选项。
			
		Parallel GC:
			-XX:+UseParallelGC		使用Parallel Scavenge + Serail Old 进行回收。虚拟机运行在server模式下的默认选项。
		
			-XX:+UseParNewGC		使用ParNew + Serial Old 来进行回收。设置新生代的收集器为ParNew收集器(并行收集器)。该设置默认是关闭的,打开该开关后,jvm会使用 ParNew + Serial Old 来进行gc。
			-XX:ParallelGCThreads	ParNew收集器的收集线程数,默认与CPU的数量相同。

			-XX:+UseParallelOldGC 	使用Parallel Scavenge + Parallel Old进行回收。
			
		CMS GC:
			-XX:+UseConcMarkSweepGC					使用ParNew + CMS收集器(并发收集失败(Concurrent Mode Failure)后使用Serial Old收集器)
			-XX:+CMSParallelRemarkEnabled			开启并行remark,以减少remark时程序暂停的时间。
			-XX:CMSInitiatingOccupancyFraction=70	当老年代的空间被占用70%后,CMS收集器开始gc。
														1>JVM会收集对象分配和释放的运行时数据,并且通过分析这些数据来决定什么时候应该进行一次gc(即:启动一次CMS垃圾收集器)。
														2>为了引导这一过程,JVM会在启动CMS收集器前进行一些线索查找,该线索由-XX:CMSInitiatingOccupancyFraction来设置,该值表示老年代的使用率。
			
			-XX:+UseCMSInitiatingOccupancyOnly		命令JVM不要根据运行时收集的数据来判断什么时候开始gc,而是根据CMSInitiatingOccupancyFraction的值来判断是否进行CMS收集。注意:一般不会打开该开关。
			
			-XX:+UseCMSCompactAtFullCollection		CMS收集器在gc时,允许对老年代进行压缩,解决因标记-清除算法导致的内存碎片的问题。
			-XX:CMSFullGCsBeforeCompaction=0		CMS收集器gc多少次后进行内存压缩(整理),由于CMS收集器使用的是标记-清除算法,所以CMS在gc后会产生内存碎片,使得运行效率降低。
			
			-XX:+CMSClassUnloadingEnabled			开启CMS收集器对永久代的gc(默认不会对永久代进行gc)。
			-XX:CMSInitiatingPermOccupancyFraction	设置永久代使用到达多少比率时触发CMS收集器的gc

			-XX:+DisableExplicitGC					禁止System.gc(),避免因开发人员不恰当地调用System.gc()方法对系统性能造成的不良的影响。
			-Xnoclassgc								禁用类垃圾回收功能,也就避免了同一个类的加载、卸载、(再次用到该类时)再加载的操作,性能会高一点。
														1>虚拟机加载类的过程中包含了IO和内存分配等操作,故JVM在加载类时会对性能产生一定的影响。
			
			-XX:+UseFastAccessorMethods				优化原始类型的getter方法的性能,默认开启。
			-XX:+PrintClassHistogram 				遇到Ctrl+Break中断,打印类实例的柱状信息,与jmap -histo功能相同
			
			-XX:SoftRefLRUPolicyMSPerMB=0			设置每兆堆空闲空间中软引用(SoftReference)的存活时间,默认值为1(秒)。
														1>softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap.
														2>SoftReference是在gc时才被回收,故SoftReference实际的存活时间可能比这个设定的值要大。
														3>一般情况下,建议设置为0。
			
			-XX:ConcGCThreads=n 					CMS线程的数量。



		
GC日志:
	-XX:+PrintGCDetails			打印GC的详细信息
	-XX:+PrintGCTimeStamps		打印GC的时间戳
	-XX:+PrintHeapAtGC 			打印GC前后堆栈的详细信息
	-Xloggc:					设置gc的log日志。eg:-Xloggc:$CATALINA_BASE/logs/gc.log

	-XX:+PrintGCApplicationStoppedTime
	-XX:+PrintGCApplicationConcurrentTime
	-XX:+PrintGCDateStamps
	-XX:+HeadDumpOnOutOfMemoryError
	-XX:HeapUdmpPath=/xx





	
	
堆栈:	
	【堆】
	-Xms 或 -XX:InitialHeapSize		初始堆大小,默认空余堆内存小于40%(MinHeapFreeRatio参数可以调整)时,JVM就会增大堆直到-Xmx的最大限制。
	-Xmx 或 -XX:MaxHeapSize			最大堆大小,默认空余堆内存大于70%(MaxHeapFreeRatio参数可以调整)时,JVM会减少堆直到-Xms的最小限制。
	-Xmn							新生代大小:
										1>新生代越大也就意味着会有更多的对象在minor GC期间被回收,如果设置的太大,则老年代就变小了,可能会频繁触发Full GC,甚至是OOM。
										2>如果新生代设置的太小,则会导致minor GC更加频繁,进而会导致更多的对象直接进入老年代,当老年代已使用的空间到达一定比例时,会触发Full GC。
							
	-XX:NewSize			设置新生代大小
	-XX:NewRatio		新生代(Eden+2个Survivor)最大容量与老年代最大容量的比值,默认为2,即:NewSize : OldSize = 1:2 	注意:该参数的值=老年代最大容量大小/新生代最大容量大小。
						eg:jstat -gccapacity PID # 查看NGCMX、OGCMN 即可验证。
	-XX:SurvivorRatio	设置Eden与1个Survivor的比值,默认为8,即 Eden : Survivor1 : Survivor2 = 8:1:1
							1>Eden越大也就意味着发生minor GC的频率越低,如果Eden设置的太大,造成Survivor太小,则会导致要回收的对象在minor GC后就直接进入老年代,从而更频繁地触发Full GC。

		
	【栈】
	-Xss				每个线程的栈大小:
							1>在相同物理内存下:减小这个值能生成更多的线程,但是操作系统对一个进程内的线程数是有限制的,不能无限生成(网上说是3k-5k左右,没有做过测试)。
							2>一般比较小的系统,如果栈不是很深,则128k就够用了,较大的系统则应设置为256k。
							3>jdk5之后,每个线程堆栈大小默认为1M。
						
	【永久代】						
	-XX:PermSize		设置永久代初始值
	-XX:MaxPermSize		设置持久代最大值
	【元数据区:jdk8后元数据区替代了永久代】
	-XX:MetaspaceSize   	控制metaspaceGC发生的初始阈值,也是最小阈值,但是触发metaspaceGC的阈值是不断变化的.
	-XX:MaxMetaspaceSize	元数据区最大值设置,元数据区不在JVM中,而是使用的本地内存。(MaxMetaspaceSize并不会在jvm启动的时候分配一块这么大的内存出来,而MaxPermSize是会分配一块这么大的内存的)

	
	
	【其它】
	-XX:+TraceClassLoading			跟踪类加载和卸载的信息,一般我们在排查内存泄露、jar包版本冲突等问题时会添加这个参数。
	-XX:-OmitStackTraceInFastThrow
		说明:
			jdk1.5后,为了提高性能,JVM在以Server模式运行时,当一些异常在代码里某个特定位置被抛出很多次后,编译器(C2)会对该方法进行重编译,重编译后,若再次出现该异常,则会抛出一个提前准备好的没有调用栈的异常。通过 -XX:-OmitStackTraceInFastThrow 可以禁用该默认的优化。
		官方:
			The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions.
			For performance purposes, when such an exception is thrown a few times, the method may be recompiled.
			After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace.

	-XX:LargePageSizeInBytes=128	设置内存页的大小
	-XX:MaxTenuringThreshold		GC最大年龄,默认15
										1>如果设置为0,则新生代对象不经过Survivor区,直接进入老年代。对于老年代中对象比较多的应用,可以提高效率。				2>如果设置为一个较大的值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象在新生代的存活时间,增加对象在新生代被回收的概率,该参数只有在串行GC时才有效。




域名解析:
	-Dsun.net.spi.nameservice.provider.1=dns,sun 	指定域名解析器 https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html
	举例:无法解析某个域名,报java.net.UnknownHostException错误
	解决:启动的时候添加参数 -Dsun.net.spi.nameservice.provider.1=dns,sun

	
	
补充:
	-XX:CMSInitiatingOccupancyFraction与-Xmn之间的关系:

		内存分配担保失败(promontion faild)的原因:
			1)Minor GC时,将eden和survivor from中存活的对象复制到survivor to中的时候,如果survivor to容纳不下这些对象,那么这些对象将晋升到老年代,
			2)此时,如果老年代中剩余的空间也无法容纳下这些对象,那么就会导致内存分配担保失败(promontion faild),进而引发了full gc。
			
				结论:当新生代与老年代满足 eden + survivor from <= 老年代剩余的空间 关系时,promontion faild就不会发生。
				
				即:eden + survivor from <= (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)
				
					由方程组:	
						Eden / Survivor=SurvivorRatio
						Eden + 2Survivor=Xmn

						Survivor * SurvivorRatio + 2Survivor = Xmn		===>	Survivor = Xmn/(SurvivorRatio+2)
						
					可得出:	
						Eden + Survivor = Xmn-Survivor = Xmn - Xmn/(SurvivorRatio+2)
				
				即:Xmn - Xmn/(SurvivorRatio+2) <= (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)
			
			简化:
				CMSInitiatingOccupancyFraction <= (1 - (Xmn-Xmn/(SurvivorRatio+2))/(Xmx-Xmn)) * 100
				eg:如果 -Xms8G -Xmx8G -Xmn3G -XX:SurvivorRatio=8,则 CMSInitiatingOccupancyFraction <= (1 - (3-3/(8+2))/(8-3))) = 46%
			
		
				CMSInitiatingOccupancyFraction低于70% 需要调整xmn或SurvivorRatior值。
	



内存优化:
	-XX:+UseCompressedOops:
		背景:在64位的HotSpot虚拟机下,引用类型需要占8个字节。

		优化:jdk6以后,64位的JVM支持对OOP(Ordinary Object Pointer 普通对象指针)进行压缩,使其只占用4个字节,以节约内存。

			-XX:+UseCompressedOops  // 开启指针压缩,jdk8下默认开启。
			-XX:-UseCompressedOops  // 关闭指针压缩



	
===================================================================================
	
网上某大牛的配置,据称可以支持每天几百万的pv。

	JAVA_OPTS="
	-Dresin.home=$SERVER_ROOT
	-server
	-Xms6000M
	-Xmx6000M
	-Xmn500M
	-XX:PermSize=500M
	-XX:MaxPermSize=500M
	-XX:SurvivorRatio=65536
	-XX:MaxTenuringThreshold=0
	-Xnoclassgc
	-XX:+DisableExplicitGC
	-XX:+UseParNewGC
	-XX:+UseConcMarkSweepGC
	-XX:+UseCMSCompactAtFullCollection
	-XX:CMSFullGCsBeforeCompaction=0
	-XX:+CMSClassUnloadingEnabled
	-XX:+CMSParallelRemarkEnabled
	-XX:CMSInitiatingOccupancyFraction=90
	-XX:SoftRefLRUPolicyMSPerMB=0
	-XX:+PrintClassHistogram
	-XX:+PrintGCDetails
	-XX:+PrintGCTimeStamps
	-XX:+PrintHeapAtGC
	-Xloggc:log/gc.log"
		
		
	说明:
		1)-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0	表示在新生代中去掉了Survivor,即新生代中只有Eden

===================================================================================

jvm参数官网查询:

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM运行参数设置需要根据具体的应用场和需求来进行调整,以下是一些常见的JVM运行参数设置建议值: 1. 初始堆大小(-Xms)和最大堆大小(-Xmx):可以根据应用的内存需求来设置。一般建议将初始堆大小和最大堆大小设置为相同的值,以避免堆大小动态调整带来的性能开销。例如,可以设置为 -Xms2g -Xmx2g 表示初始堆大小和最大堆大小都为2GB。 2. 年轻代大小(-Xmn):年轻代是对象分配的主要区域,可以根据应用的对象创建和回收频率来设置。一般建议将年轻代大小设置为整个堆大小的1/3到1/4左右。例如,可以设置为 -Xmn1g 表示年轻代大小为1GB。 3. 年老代大小(-XX:MaxTenuringThreshold):年老代是存放长时间存活的对象的区域,可以根据应用的对象生命周期来设置。一般建议将年老代大小设置为整个堆大小的2/3到3/4左右。例如,可以设置为 -XX:MaxTenuringThreshold=15 表示对象经过15次垃圾回收后仍然存活,则会被移到年老代。 4. 垃圾回收器选择(-XX:+UseParallelGC):根据应用的性能需求和硬件环境来选择合适的垃圾回收器。如果对吞吐量要求较高,可以选择并行垃圾回收器(-XX:+UseParallelGC);如果对延迟要求较高,可以选择CMS垃圾回收器(-XX:+UseConcMarkSweepGC)或者G1垃圾回收器(-XX:+UseG1GC)。 5. 元空间大小(-XX:MaxMetaspaceSize):元空间用于存放类的元数据信息,可以根据应用的类加载和卸载频率来设置。一般建议将元空间大小设置为应用所需的最大类数量的两倍左右。例如,可以设置为 -XX:MaxMetaspaceSize=256m 表示元空间大小为256MB。 请注意,以上只是一些常见的JVM运行参数设置建议值,具体的设置还需要根据实际情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值