jvm的认知
- jvm概括图

- java堆

- java栈

一些参数学习记录
- 栈的大小设定
1: [-Xss10m] 意思就是设置栈的最大大小
我们在递归的时候,设置的栈越大,递归的深度就会越大
- 方法区(永久区)的设定
方法区是一块所有线程共享的内存区域,用于保存系统的类信息,方法区可以保存多少信息,是可以进行配置的,配置如下.
1: [-XX:PermSize=64M] 初始化方法区的大小
2: [-XX:MaxPermSize=64M] 最大方法区的大小
- 直接内存
直接内存主要应用于NIO,是跳过java堆直接操作原生堆,加快处理速度,但是也不一定是必能提高处理速度的;
1:[-XX:MaxDirectMemorySize] 设置最大直接内存空间,如果不设置,默认为最大堆内存空间,即[-Xmx]直接内存达到上限时,会触发GC,GC不能有效回收,也会触发OOM(内存泄露);
-
其他参数的说明
CATALINA_OPTS="$CATALINA_OPTS -server -Djava.awt.headless=true
-Xms2560m [JVM初始分配的堆内存 2.5G]
-Xmx2560m [JVM最大可用堆内存 2.5G]
-Xss256k [每个线程的堆栈大小]
-XX:PermSize=128m [永久代大小]
-XX:MaxPermSize=384m [永久代最大值]
-XX:NewSize=1024m [新生代初始内存大小]
-XX:MaxNewSize=1024m [新生代最大内存大小]
-XX:SurvivorRatio=22 [新生代中eden与survivor的容量比值,默认为8,线上竟然设置为这么大!!]
-XX:+UseParNewGC [使用ParNew+Serial Old的组合回收器]
-XX:ParallelGCThreads=4 [GC时进行内存回收的线程数]
-XX:MaxTenuringThreshold=9 [老年代阈值,熬过9次young GC就进入老年代]
-XX:+UseConcMarkSweepGC [使用ParNew+CMS+SerialOld进行组合回收,当CMS失败时,SerialOld作为后备回收器]
-XX:+DisableExplicitGC [忽略System.gc()方法触发的垃圾回收,即在程序中,是无法通过System.gc()进行垃圾回收的]
-XX:+ScavengeBeforeFullGC [开启在full GC之前触发一次minor GC]
-XX:+CMSParallelRemarkEnabled [并行的进行remark标记,降低GC停顿时间]
-XX:+UseCMSCompactAtFullCollection [开启在CMS回收老年代之后进行一次内存碎片整理]
-XX:CMSFullGCsBeforeCompaction=9 [在9次CMS老年代回收之后,进行一次内存碎片整理]
-XX:+UseCMSInitiatingOccupancyOnly [强迫JVM仅仅使用CMSInitiatingOccupancyFraction的值作为触发CMS的因素,否则JVM可能会使用其他指标启动CMS]
-XX:CMSInitiatingOccupancyFraction=60 [当老年代使用比率达到这个值时,就出发CMS]
-XX:SoftRefLRUPolicyMSPerMB=0 [如此设置,会在每次GC时,均将软引用回收掉,默认是在内存不够时,才试图去回收软引用]
-XX:-ReduceInitialCardMarks
-XX:+CMSPermGenSweepingEnabled [启用CMS清理永久代]
-XX:+CMSClassUnloadingEnabled [启用CMS清理永久代的功能,CMS卸载无用的classes]
-XX:CMSInitiatingPermOccupancyFraction=70 [永久代使用比率达到多少时,会回收永久代]
-XX:+ExplicitGCInvokesConcurrent -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dj
ava.util.logging.config.file="%CATALINA_HOME%\conf\logging.properties"
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC
-Xloggc:/data/applogs/heap_trace.txt
-XX:-HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/applogs/HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Xms 堆内存的最小大小,默认为物理内存的1/64
-Xmx 堆内存的最大大小,默认为物理内存的1/4
-Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn
-Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:新生代大小
-XX:NewRatio:设置新生代和老年代的比值。如:为3,表示年轻代与老年代比值为1:3
-XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5
-XX:MaxTenuringThreshold:设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
收集器设置
-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数。并行收集线程数。