怎样看网站的建设时间,做网站代理商,互联网产品推广方案范文,路由器做内部网站服务器文章目录1、JVM参数有哪些#xff1f;1.1、 标准参数1.2、-X参数1.3、 -XX参数1.4、 其他参数1.5、 查看参数1.6、 设置参数的常见方式1.7、 常用参数含义2、JVM常用命令有哪些#xff1f;2.1、jps2.2、jinfo2.3、jstat2.4、jstack2.5、jmap3、你会估算GC频率吗?4、 内存溢出…
文章目录1、JVM参数有哪些1.1、 标准参数1.2、-X参数1.3、 -XX参数1.4、 其他参数1.5、 查看参数1.6、 设置参数的常见方式1.7、 常用参数含义2、JVM常用命令有哪些2.1、jps2.2、jinfo2.3、jstat2.4、jstack2.5、jmap3、你会估算GC频率吗?4、 内存溢出(OOM)怎么解决4.1、大并发[秒杀]4.2、内存泄露导致内存溢出1、JVM参数有哪些
1.1、 标准参数
-version
-help
-server
-cp1.2、-X参数
-Xint 解释执行
-Xcomp 第一次使用就编译成本地代码
-Xmixed 混合模式JVM自己来决定1.3、 -XX参数
使用得最多的参数类型主要用于JVM调优和Debug
a.Boolean类型
格式-XX:[-]name 或-表示启用或者禁用name属性
比如-XX:UseConcMarkSweepGC 表示启用CMS类型的垃圾回收器-XX:UseG1GC 表示启用G1类型的垃圾回收器
b.非Boolean类型
格式-XXnamevalue表示name属性的值是value
比如-XX:MaxGCPauseMillis500 1.4、 其他参数
这块也相当于是-XX类型的参数
-Xms1000M等价于-XX:InitialHeapSize1000M
-Xmx1000M等价于-XX:MaxHeapSize1000M
-Xss100等价于-XX:ThreadStackSize1001.5、 查看参数 java -XX:PrintFlagsFinal -version flags.txt值得注意的是“表示默认值”:表示被用户或JVM修改后的值 一般要设置参数可以先查看一下当前参数是什么然后进行修改 1.6、 设置参数的常见方式
开发工具中设置比如IDEAeclipse运行jar包的时候:java -XX:UseG1GC xxx.jarweb容器比如tomcat可以在脚本中的进行设置通过jinfo实时调整某个java进程的参数(参数只有被标记为manageable的flags可以被实时修改)
1.7、 常用参数含义
参数含义说明-XX:CICompilerCount3最大并行编译数如果设置大于1虽然编译速度会提高但是同样影响系统稳定性会增加JVM崩溃的可能-XX:InitialHeapSize100M初始化堆大小简写-Xms100M-XX:MaxHeapSize100M最大堆大小简写-Xms100M-XX:NewSize20M设置年轻代的大小-XX:MaxNewSize50M年轻代最大大小-XX:OldSize50M设置老年代大小-XX:MetaspaceSize50M设置方法区大小-XX:MaxMetaspaceSize50M方法区最大大小-XX:UseParallelGC使用UseParallelGC新生代吞吐量优先-XX:UseParallelOldGC使用UseParallelOldGC老年代吞吐量优先-XX:UseConcMarkSweepGC使用CMS老年代停顿时间优先-XX:UseG1GC使用G1GC新生代老年代停顿时间优先-XX:NewRatio新老生代的比值比如-XX:Ratio4则表示新生代:老年代1:4也就是新生代占整个堆内存的1/5-XX:SurvivorRatio两个S区和Eden区的比值比如-XX:SurvivorRatio8也就是(S0S1):Eden2:8也就是一个S占整个新生代的1/10-XX:HeapDumpOnOutOfMemoryError启动堆内存溢出打印当JVM堆内存发生溢出时也就是OOM自动生成dump文件-XX:HeapDumpPathheap.hprof指定堆内存溢出打印目录表示在当前目录生成一个heap.hprof文件-XX:PrintGCDetails -XX:PrintGCTimeStamps -XX:PrintGCDateStamps -Xloggc:g1-gc.log打印出GC日志可以使用不同的垃圾收集器对比查看GC情况-Xss128k设置每个线程的堆栈大小经验值是3000-5000最佳-XX:MaxTenuringThreshold6提升年老代的最大临界值默认值为 15-XX:InitiatingHeapOccupancyPercent启动并发GC周期时堆内存使用占比G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示”一直执行GC循环”. 默认值为 45.-XX:G1HeapWastePercent允许的浪费堆空间的占比默认是10%如果并发标记可回收的空间小于10%,则不会触发MixedGC。-XX:MaxGCPauseMillis200msG1最大停顿时间暂停时间不能太小太小的话就会导致出现G1跟不上垃圾产生的速度。最终退化成Full GC。所以对这个参数的调优是一个持续的过程逐步调整到最佳状态。-XX:ConcGCThreadsn并发垃圾收集器使用的线程数量默认值随JVM运行的平台不同而不同-XX:G1MixedGCLiveThresholdPercent65混合垃圾回收周期中要包括的旧区域设置占用率阈值默认占用率为 65%-XX:G1MixedGCCountTarget8设置标记周期完成后对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数默认8次混合垃圾回收混合回收的目标是要控制在此目标次数以内-XX:G1OldCSetRegionThresholdPercent1描述Mixed GC时Old Region被加入到CSet中默认情况下G1只把10%的Old Region加入到CSet中
2、JVM常用命令有哪些
2.1、jps
查看java进程 2.2、jinfo
实时查看和调整JVM配置参数
# 查看某个java进程属性的值
jinfo -flag MaxHeapSize PID
jinfo -flag UseG1GC PID# 参数只有被标记为manageable的flags可以被实时修改
jinfo -flag [|-] PID
jinfo -flag namevalue PID# 查看曾经赋过值的一些参数
jinfo -flags PID2.3、jstat
查看虚拟机性能统计信息
# 查看类装载信息 每1000毫秒输出一次共输出10次
jstat -class PID 1000 10 # 查看垃圾收集信息
jstat -gc PID 1000 102.4、jstack
查看线程堆栈信息
jstack PID排查死锁案例
//运行主类
public class DeadLockDemo
{public static void main(String[] args){DeadLock d1new DeadLock(true);DeadLock d2new DeadLock(false);Thread t1new Thread(d1);Thread t2new Thread(d2);t1.start();t2.start();}
}
//定义锁对象
class MyLock{public static Object obj1new Object();public static Object obj2new Object();
}
//死锁代码
class DeadLock implements Runnable{private boolean flag;DeadLock(boolean flag){this.flagflag;}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锁);}}}}}
}jstack分析 把打印信息拉到最后可以发现1个死锁信息。
2.5、jmap
# 打印出堆内存相关信息
jmap -heap PID# 生成堆快照
jmap -dump:formatb,fileheap.hprof PID一般在开发中JVM参数可以加上下面两句这样内存溢出时会自动dump出该文件
-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathheap.hprof
3、你会估算GC频率吗?
正常情况我们应该根据我们的系统来进行一个内存的估算这个我们可以在测试环境进行测试最开始可以将内存设置的大一些比如4G这样当然这也可以根据业务系统估算来的。
比如从数据库获取一条数据占用128个字节需要获取1000条数据那么一次读取到内存的大小就是(128 B/1024 Kb/1024M* 1000 0.122M那么我们程序可能需要并发读取比如每秒读取100次那么内存占用就是0.122100 12.2M如果堆内存设置1个G那么年轻代大小大约就是333M那么333M*80%/12.2M 21.84s也就是说我们的程序几乎每分钟进行两到三次youngGC。这样可以让我们对系统有一个大致的估算。
4、 内存溢出(OOM)怎么解决
发生内存溢出一般会有两个原因
内存不够用大并发情况下代码问题内存泄露导致内存溢出
4.1、大并发[秒杀]
缓存、CDN、集群负载均衡、限流等方式解决
4.2、内存泄露导致内存溢出 jstack查看线程情况有没有死锁或者IO阻塞的情况查找可能出现问题的类名或等待时间最长的进程号。 jstack PID查看堆内存的使用获取到jvm.hprof文件上传到指定的工具分析比如heaphero.io jmap -heap PID