-version -help -server -cp
1.1.2 -X parameters
Non-standard parameters, that is likely to change in the various versions of the JDK
- Xint interpreted - Xcomp first use compiled to native code -Xmixed mixed mode, JVM to decide
1.1.3 -XX parameters
a.Boolean Type Format: -XX: [+ -] < name> + or - to enable or disable the name attribute represents
for example: -XX: + UseConcMarkSweepGC enabled indicates the garbage collector type CMS -XX: + UseG1GC enabled G1 indicates the type of garbage collector b form a non-Boolean types:. -XX <name> = <value> represents the value of the name attribute is a value such as: -XX: MaxGCPauseMillis = 500
-Xms1000 equivalent -XX: InitialHeapSize = 1000 -Xmx1000 equivalent to -XX: maxHeapSize = 1000 -Xss100 equivalent to -XX: ThreadStackSize = 100
It is worth noting that the " = " indicates the default value, " : = " represents a value after the user has been modified or JVM To see the value of a specific process parameters can be used jinfo, behind this talk generally set the parameters, you can look at what the current parameters are then modified
1.1.6 set the parameters of the way
development tool set such as IDEA, eclipse
run the jar when the package: java -XX: + UseG1GC xxx.jar
Web container such as tomcat, can be set in the script of
real-time adjustment process through a java jinfo the parameters (parameters are marked as manageable only the flags can be modified in real time)
1Byte (bytes) = 8bit (bits) 1KB = 1024Byte (bytes) 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB
( 1 ) Set the heap memory size and parameters of the printing -Xms100m -XX -Xmx100m is: + PrintFlagsFinal ( 2 ) + PrintFlagsFinal query value: = to true ( . 3 ) the query heap memory size maxHeapSize: = 104857600 ( . 4 ) in terms 104857600 (Byte) / 1024 = 102400 (KB) 102400 (KB) / 1024 = 100 (MB) ( . 5 ) in units of bytes is concluded 104857600
参数 含义 说明 http://www.jisupdfeditor.com/ -XX:CICompilerCount=3 最大并行编译数 如果设置大于1,虽然编译速度会提高,但是同样影响系 统稳定性,会增加JVM崩溃的可能 -XX:InitialHeapSize=100M 初始化堆大小 简写-Xms100M -XX:MaxHeapSize=100M 最大堆大小 简写-Xmx100M -XX:NewSize=20M 设置年轻代的大小 -XX:MaxNewSize=50M 年轻代最大大小 -XX:OldSize=50M 设置老年代大小 -XX:MetaspaceSize=50M 设置方法区大小 -XX:MaxMetaspaceSize=50M 方法区最大大小 -XX:+UseParallelGC 使用UseParallelGC 新生代,吞吐量优先 -XX:+UseParallelOldGC 使用UseParallelOldGC 老年代,吞吐量优先 -XX:+UseConcMarkSweepGC 使用CMS 老年代,停顿时间优先 -XX:+UseG1GC 使用G1GC 新生代,老年代,停顿时间优先 -XX:NewRatio 新老生代的比值 比如-XX:Ratio=4,则表示新生代:老年代=1:4,也就是新 生代占整个堆内存的1/5 -XX:SurvivorRatio 两个S区和Eden区的比值 比如-XX:SurvivorRatio=8,也就是(S0+S1):Eden=2:8, 也就是一个S占整个新生代的1/10 -XX:+HeapDumpOnOutOfMemoryError 启动堆内存溢出打印 当JVM堆内存发生溢出时,也就是OOM,自动生成dump 文件 -XX:HeapDumpPath=heap.hprof 指定堆内存溢出打印目录 表示在当前目录生成一个heap.hprof文件 XX:+PrintGCDetails - XX:+PrintGCTimeStamps - XX:+PrintGCDateStamps Xloggc:$CATALINA_HOME/logs/gc.log 打印出GC日志 可以使用不同的垃圾收集器,对比查看GC情况 -Xss128k 设置每个线程的堆栈大小 经验值是3000-5000最佳 -XX:MaxTenuringThreshold=6 提升年老代的最大临界值 默认值为 15 -XX:InitiatingHeapOccupancyPercent 启动并发GC周期时堆内存使用占比 G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆 的使用率,而不只是某一代内存的使用比. 值为 0 则表 示”一直执行GC循环”. 默认值为 45. -XX:G1HeapWastePercent 允许的浪费堆空间的占比 默认是10%,如果并发标记可回收的空间小于10%,则不 会触发MixedGC。 -XX:MaxGCPauseMillis=200ms G1最大停顿时间 暂停时间不能太小,太小的话就会导致出现G1跟不上垃 圾产生的速度。最终退化成Full GC。所以对这个参数的 调优是一个持续的过程,逐步调整到最佳状态。 -XX:ConcGCThreads=n 并发垃圾收集器使用的线程数量 默认值随JVM运行的平台不同而不同 -XX:G1MixedGCLiveThresholdPercent=65 混合垃圾回收周期中要包括的旧区域设置 占用率阈值 默认占用率为 65% -XX:G1MixedGCCountTarget=8 设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧 区域执行混合垃圾回收的目标次数 默认8次混合垃圾回收,混合回收的目标是要控制在此目 标次数以内 - XX:G1OldCSetRegionThresholdPercent=1 描述Mixed GC时,Old Region被加入到 CSet中 默认情况下,G1只把10%的Old Region加入到CSet中
jinfo -flag MaxHeapSize PID
jinfo -flag UseG1GC PID
(3)修改
参数只有被标记为manageable的flags可以被实时修改
jinfo -flag [+|-] PID
jinfo -flag = PID
jinfo -flags PID
jstat -class PID 1000 10 查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10 次
jstat -gc PID 1000 10
// 运行主类 public class DeadLockDemo { public static void main(String[] args) { DeadLock d1 = new DeadLock(true); DeadLock d2 = new DeadLock(false); Thread t1 = new Thread(d1); Thread t2 = new Thread(d2); t1.start(); t2.start(); } } // 定义锁对象 class MyLock { public static Object obj1 = new Object(); public static Object obj2 = new Object(); } // 死锁代码 class DeadLock implements Runnable { private boolean flag; DeadLock(boolean flag) { this.flag = flag; } public void run() { if (flag) { while (true) { synchronized (MyLock.obj1) { System.out.println(Thread.currentThread().getName() + "----if 获得obj1锁"); synchronized (MyLock.obj2) { System.out.println(Thread.currentThread().getName() + "--- -if获得obj2锁"); } } } } else { while (true) { synchronized (MyLock.obj2) { System.out.println(Thread.currentThread().getName() + "----否则 获得obj2锁"); synchronized (MyLock.obj1) { System.out.println(Thread.currentThread().getName() + "--- -否则获得obj1锁"); } } } } } }
-XX:+PrintFlagsFinal -Xms300M -Xmx300M
jmap -heap PID
(3)dump出堆内存相关信息
jmap -dump:format=b,file=heap.hprof PID
jmap -dump:format=b,file=heap.hprof 44808
(4)要是在发生堆内存溢出的时候,能自动dump出该文件就好了
一般在开发中,JVM参数可以加上下面两句,这样内存溢出时,会自动dump出该文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
设置堆内存大小: -Xms20M -Xmx20M 启动,然后访问localhost:9090/heap,使得堆内存溢出
命令行中输入:jconsole
(1)在visualvm中选中“远程”,右击“添加” (2)主机名上写服务器的ip地址,比如31.100.39.63,然后点击“确定” (3)右击该主机“31.100.39.63”,添加“JMX”[也就是通过JMX技术具体监控远端服务器哪个Java进程] (4)要想让服务器上的tomcat被连接,需要改一下 bin/catalina.sh 这个文件
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote
- Djava.rmi.server.hostname=31.100.39.63
-Dcom.sun.management.jmxremote.port=8998
-Dcom.sun.management.jmxremote.ssl=false
- Dcom.sun.management.jmxremote.authenticate=true
- Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access - Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password"
(5)在 ../conf 文件中添加两个文件jmxremote.access和jmxremote.password
guest readonly manager readwrite
guest guest
manager manager
授予权限 : chmod 600 *jmxremot*
hostname -i 查看输出情况 172.26.225.240 172.17.0.1 vim /etc/hosts 172.26.255.240 31.100.39.63
./startup.sh
tail -f ../logs/catalina.out
lsof -i tcp:8080
lsof -i:8998 得到PID netstat -antup | grep PID
端口:8998 用户名:manager 密码:manager
curl -O https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar # 然后可以选择一个Java进程
java -jar arthas-boot.jar -h
jmap -dump:format=b,file=heap.hprof 44808
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
Class Name:类名称,java类名
Objects:类的对象的数量,这个对象被创建了多少个
Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用
Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和
右击类名--->List Objects--->with incoming references--->列出该类的实例
右击Java对象名--->Merge Shortest Paths to GC Roots--->exclude all ...--->找到GC Root以及原因
Reports--->Leak Suspects--->Details
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps -Xloggc:gc.log
在线
http://gceasy.io
GCViewer