一、常用参数-Xms
启动JVM时申请的初始Heap值,默认值为操作系统物理内存的1/64,但小于1G。默认情况下,当可用堆内存大于70%时,JVM会将堆的大小减小到-Xms指定的大小。可以通过-XX:MaxHeapFreeRation =来指定此比率。最好将服务器端JVM的-Xms和-Xmx设置为相同的值,以避免在每次垃圾回收完成后JVM重新分配内存。开发和测试机器JVM可以保留默认值。 (例如-Xms4g)
-Xmx
JVM可以申请的最大堆值。默认值为物理内存的1/4,但小于1G。默认情况下,当可用堆内存少于40%时,JVM会将Heap增加到-Xmx指定的大小,可以将其传递给-XX:MinHeapFreeRation =以指定此比率。最佳设置取决于计算机中物理内存的大小和其他内存开销。 (例如:-Xmx4g)
-Xmn
Java Heap Young区域大小。整个堆大小=年轻代的大小+老代的大小+持久代的大小(相对于虚拟机的HotSpot类型)。永久代通常具有64m的固定大小,因此在增加年轻代后,老一代的大小将减小。此值对系统性能有较大影响。 Sun正式建议配置整个堆的3/8。 (例如:-Xmn2g)
程序的新创建对象都是年轻一代分配的内存。年轻一代由伊甸园空间和两个相同大小的幸存者空间组成(通常称为S0和S1或从和到)。可以通过-Xmn参数指定年轻的世代。世代的大小,还可以通过-XX:SurvivorRation来调整Eden Space和SurvivorSpace的大小。

旧时代用于存储许多新一代GC之后仍然存在的对象,例如缓存的对象。新创建的对象也可能直接进入旧时代。有两种主要情况:1、大对象,可以通过启动参数进行设置-XX:PretenureSizeThreshold = 1024(单位为字节,默认值为0),表示当大小超过大小时,它将不会2、大型数组对象,并且在数组中没有引用外部对象老数组占用的内存大小是对应于-Xmx的值减去对应的值到-Xmn。如果堆中没有内存来完成实例分配,并且无法再扩展堆,则会抛出OutOfMemoryError异常。
-Xss
Java中每个线程的堆栈大小。在JDK 5. 0之后,每个线程的堆栈大小为1M,之前的每个线程的堆栈大小为256K。根据应用程序线程所需的内存大小进行调整。在相同的物理内存下,减小此值可以生成更多的线程。但是,操作系统对进程中的线程数仍然有限制,并且不能无限期地生成它。经验值在3000〜5000左右。 (例如:-Xss1024K)
-XX:PermSize
持久代的初始内存大小(方法区域)。 (例如:-XX:PermSize = 64m)
-XX:MaxPermSize
持久代(方法区域)的最大内存大小。 (例如:-XX:MaxPermSize = 512m)
-XX:+ UseSerialGC
串行(SerialGC)是jvm的默认GC方法,通常适用于小型应用程序和单个处理器。该算法相对简单,GC效率较高,但可能会导致应用程序暂停。

-XX:+ UseParallelGC
ParallelGC是指由多个线程并行执行GC。它通常适用于多处理器系统,可以提高GC的效率,但是算法复杂,系统消耗很多。 (一起使用:-XX:ParallelGCThreads = 8,并行收集器的线程数,最好将该值配置为等于处理器数)
-XX:+ UseParNewGC
将年轻代设置为并行收集,在JKD 5. 0之上,JVM将根据系统配置对其进行设置,因此无需设置该值。
-XX:+ UseParallelOldGC
将旧一代设置为并行集合,该参数选项出现在JKD 6. 0中。
-XX:+ UseConcMarkSweepGC
并发(ConcMarkSweepGC)表示GC运行时,它几乎对应用程序的运行没有影响(它也会引起暂停,但它很小)。 GC和应用程序的线程是同时执行的,因此不会最大程度地影响应用程序。运行。
-XX:+ UseCMSCompactAtFullCollection
在Full GC期间,压缩并组织旧的一代。由于CMS不会移动内存,因此很容易发生内存碎片。因此,通过增加此参数,可以在FullGC之后对内存进行压缩和组织以消除内存碎片。当然,此操作也有某些缺点,即会增加CPU开销和GC时间,因此可以使用参数-XX:CMSFullGCsBeforeCompaction = 3来控制对Full GC进行碎片整理的次数。
-XX:+ CMSInitiatingOccupancyFraction = 80
这意味着在达到老年使用的空间的80%之后,将执行Full GC。 CMS收集器在垃圾收集期间与应用程序一起使用。因此,您不能等到旧一代几乎被填满后再进行收集。这将影响并发应用程序线程的空间使用,并再次触发不必要的Full GC。
-XX:+ MaxTenuringThreshold = 10
垃圾的最长使用期限,这意味着对象在Survivor区域中进行10次复制后进入了旧使用期限。如果设置为0,则年轻代对象不会通过Survivor区域,而直接进入旧代。
二、分类
JVM启动参数分为三类:
1、标准参数(-),所有JVM实现都必须实现这些参数的功能并且向后兼容。例如:-verbose:class(当jvm报告找不到该类或可以诊断该类冲突时,输出jvm加载的类的相关信息); -verbose:gc(输出每个GC的相关情况); -verbose:jni(输出有关本机方法调用的相关信息,通常用于诊断jni调用错误消息)。

2、非标准参数(-X),默认的jvm实现这些参数的功能,但不能保证所有jvm实现都得到满足,并且不能保证向后兼容。例如:-Xms512m; -Xmx512m; -Xmn200m; -Xss128k; -Xloggc:file(类似于-verbose:gc函数,只是将每个GC事件的相关信息记录到文件中。文件的位置最好在本地。为避免潜在的网络问题。如果它出现在命令行与详细命令同时出现,以-Xloggc为准)。
3、非稳定参数(-XX),对于每个jvm实现,此类参数将有所不同,并且将来可能随时取消,因此需要谨慎使用。例如:-XX:PermSize = 64m; -XX:MaxPermSize = 512m。
三、报价
主要介绍JVM内存参数的详细配置和GC策略(原始:)。
无论是YGC还是Full GC,GC进程都会中断程序操作。正确选择不同的GC策略,调整JVM和GC的参数,可以大大减少GC工作引起的程序运行。中断问题,然后适当地提高Java程序的效率。但是,调整GC是一个极其复杂的过程。因为每个程序具有不同的特性,例如:Web和GUI程序非常不同(可以适当地暂停Web,但是客户不能接受GUI暂停),并且由于运行而导致每台计算机上的配置也不同(杯子的主要数量)和内存是不同的),因此所用GC的类型也将有所不同(有关如何选择,请参见GC类型和如何选择)。本文将重点介绍JVM和GC的一些重要参数的设置,以提高系统性能。 JVM内存组成和GC相关的内容,请参阅上一篇文章:JVM内存组成GC策略和内存应用程序。以下示例分析显示了JVM参数含义的示例:

并行收集器相关参数:

CMS相关参数:

辅助信息:

3. 1 GC性能注意事项
GC的性能有两个主要指标:吞吐量(工作时间除gc的时间与总时间之比)和暂停(gc发生时应用无法响应外部显示)。
1、总堆,默认情况下,vm将增加/减小堆大小,以维持整个vm中的可用空间比率。此比率由MinHeapFreeRatio和MaxHeapFreeRatio指定。一般来说,服务器端的应用程序具有以下规则:为vm分配尽可能多的内存;将Xms和Xmx设置为相同的值。如果虚拟机启动时使用的内存较小,并且此时需要初始化许多对象,则虚拟机必须反复增加内存。随着处理器核心数量的增加,内存也随之增加。
2、年轻一代,影响应用程序流畅运行的另一个因素是年轻一代的大小。年轻一代越大,次要收藏就越少;但是在堆大小固定的情况下,较大的年轻代意味着较小的终身代,这意味着更多的主要集合(主要集合将触发次要集合)。 NewRatio反映了年轻一代和终身一代的规模比。 NewSize和MaxNewSize反映了年轻代大小的下限和上限。将这两个值设置为相同将固定年轻代大小(与Xms和Xmx相同)。如果需要,SurvivorRatio也可以优化幸存者的大小,但这不会对性能产生很大影响。 SurvivorRatio是伊甸园和幸存者的比率。一般来说,服务器端的应用程序具有以下规则:首先确定可以分配给vm的最大堆大小,然后设置最佳的年轻代大小。如果堆大小是固定的,则增加年轻代的大小就意味着减小持久代的大小。让有任期的一代在任何时候都足够大,以容纳所有实时数据(保留10%-20%的免费空间)。
3. 2体验和规则
1、年轻代大小选择:响应时间优先应用:设置得尽可能大,直到接近系统的最小响应时间限制(根据实际情况选择)。在这种情况下,年轻一代的收集频率也最小。同时,减少到达老一代的对象;吞吐量优先的应用程序:设置得尽可能大,并可能达到Gbit的水平。由于不需要响应时间,因此可以并行执行垃圾回收,并且通常适用于8CPU以上的应用;避免设置得太小。如果将年轻代设置得太小,则会导致:1. YGC时间更加频繁2.可能会导致YGC对象直接进入老代,如果此时老代已满,则会触发FGC。
2、上一代的大小选择:响应时间优先级应用:上一代使用并发收集器,因此需要仔细设置其大小,通常要考虑一些参数,例如并发会话速率和会话持续时间。如果将堆设置为小,则可能导致内存碎片,较高的恢复频率和应用程序挂起,并使用传统的标记删除方法;如果堆很大,则收集将花费很长时间。最优化的解决方案通常需要参考以下数据来获取并发垃圾收集信息,持久代的并发集合数,传统GC信息以及花在回收年轻代和后续代上的时间比例老一辈。吞吐量优先的应用程序:通常,吞吐量优先的应用程序具有较大的年轻一代和较小的老式一代。原因是大多数短期对象可以被尽可能多地回收,而中期对象可以减少。老一辈人会尽可能多地存储长期存在的物体。
3、由较小的堆引起的碎片问题:由于较旧的并发收集器使用标记和清除算法,因此它们不会压缩堆。回收器回收时,它将占用相邻的Merge空间,以便可以将其分配给较大的对象。但是,当堆空间较小时,经过一段时间的操作后,将出现“碎片”。如果并发收集器找不到足够的空间,则并发收集器将停止。然后使用传统的标记和清除方法进行回收。如果出现“碎片”,则可能需要以下配置:-XX:+ UseCMSCompactAtFullCollection:使用并发收集器时,启用旧版本的压缩; -XX:CMSFullGCsBeforeCompaction = 0:打开上述配置后,此处设置了多少个完整GC来压缩旧版本。
4、使用CMS的优势是尽可能少使用年轻代,经验值是128M-256M,然后老一代使用CMS并行收集,这可以确保低延迟吞吐效率系统的。实际上,cms收集的暂停时间很短,有2G内存,大约20-80ms的应用程序暂停时间
5、当系统停止时,可能是GC问题或程序问题。使用jmap和jstack进行查看,或使用killall -3 java,然后查看Java控制台日志,可以看到很多问题。 (相关工具的使用将在下面的博客中介绍。)
6、仔细了解您的应用程序。如果使用缓存,则旧的缓存应该更大。缓存的HashMap不应是无限的。建议使用LRU算法的Map进行缓存。 LRUMap的最大长度也应基于“实际”设置。
7、使用并发收集时,较年轻的一代应该较小,而较老的一代应该较大,因为较老的一代使用并发集合。即使时间较长,也不会影响其他程序的继续运行,并且网站也不会停止。
8、 JVM参数的设置(尤其是-Xmx -Xms -Xmn-XX:SurvivorRatio-XX:MaxTenuringThreshold等)没有固定的公式。它需要基于PV旧区中的实际数据和YGC的数量。测量。为了避免升级失败,xmn设置可能太小,这也意味着YGC的数量将增加,并且处理并发访问的能力将降低。每次参数调整都需要进行详细的性能测试,以找到特定的应用。最佳配置。
3. 3促销失败:
促销失败是垃圾收集期间的一个令人头疼的问题。通常,它可能是由两个原因引起的。第一个原因是营救空间不足。救援空间中的物体不应移至老一代,而年轻一代则应有。需要将许多物体放到救援空间中。第二个原因是,老一代人没有足够的空间来容纳年轻一代人的物体。在这两种情况下,它们都将切换为Full GC,并且该网站将停止很长时间。
解决方案一:
我最终解决方案的第一个原因是删除救援空间并设置-XX:SurvivorRatio = 65536 -XX:MaxTenuringThreshold = 0。第二个原因是将CMSInitiatingOccupancyFraction设置为某个值(假设7 0),以便当旧一代的空间达到70%时,将执行CMS,并且旧一代有足够的空间来接受来自年轻一代的对象世代。
解决方案1的改进
有改进。上面的方法不是很好,因为没有使用救援空间,所以老一代很容易装满,并且CMS将更频繁地执行。我做了一些改进,仍然使用了救援空间,但是增加了救援空间,以确保升级不会失败。在特定操作方面,32位Linux和64位Linux似乎有所不同。看来,如果为64位系统配置了MaxTenuringThreshold参数,则CMS仍会暂停。为了解决暂停和升级失败的问题,我最终设置了-XX:SurvivorRatio = 1并删除了MaxTenuringThreshold,这样就没有暂停并且proprotoin也没有失败,更重要的是,老一代和永久一代的崛起非常缓慢(因为许多对象在到达旧版本之前将被回收),CMS的执行频率非常低,并且每隔几个小时执行一次。这样,无需重新启动服务器。
-Xmx4000M -Xms4000M -Xmn600M-XX:PermSize = 500M -XX:MaxPermSize = 500M -Xss256K -XX:+ DisableExplicitGC-XX:SurvivorRatio = 1 -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC-XX:+ CMSParallelRemarkEnabled- XX:+ UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction = 0-XX:+ CMSClassUnloadingEnabled -XX:LargePageSizeInBytes = 128M-XX:+ UseFastAccessorMethods -XX:+ UseCMSInitiatingOccupancyOnly-XX:CMSInitiatingOccupancyOnly-XX:CMSInitiatingO + XX:+ PrintHeapAtGC -Xloggc:log / gc.log
3. 4 CMSInitiatingOccupancyFraction值和Xmn的关系公式
上面介绍了失败的原因。当EDEN空间不足时,如果将EDEN和From Survivor中的幸存对象存储在To Survivor区域中,则To Survivor区域中的空间不足,然后又被提升到旧gen区域,并且旧gen Promonation失败当区域内存不足时发生,这将导致gc满。可以推断出:eden +来自幸存者
(Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction / 10 0)> =(Xmn-Xmn /(SurvivorRatior + 2))并推断为:CMSInitiatingOccupancyFraction
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-375205-1.html
#舞蹈担当易烊千玺#