2.1 吞吐量优先的并行收集器java -server -Xmx4g -Xms4g -Xmn2g –Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy
-XX:+UseParallelGC:选择垃圾收集器为并行收集器 。此配置仅对年轻代有效 。即上述配置下 , 年轻代使用并发收集,而年老代仍旧使用串行收集 。-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收 。此值最好配置与处理器数目相等 。-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集 。JDK6.0支持对年老代并行收集 。-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例 , 以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开 。2.2 响应时间优先的并发收集器java -server -Xmx4g -Xms4g -Xmn2g –Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
-XX:+UseConcMarkSweepGC: 设置年老代为并发收集-XX:+UseParNewGC: 设置年轻代为并行收集 。可与CMS收集同时使用-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低 。此值设置运行多少次GC以后对内存空间进行压缩、整理 。-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩 。可能会影响性能,但是可以消除碎片3、其他辅助配置GC日志打印
-XX:+PrintGC:输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]-XX:+PrintGCDetails:输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]OOM生成dump文件
-XX:+HeapDumpOnOutOfMemoryError 表示jvm发生oom异常时,自动生成dump文件-XX:HeapDumpPath= 表示生成dump文件的存放目录四、内存溢出排查【JAVA系列之JVM内存调优】一般来说内存溢出主要分为以下几类:
堆溢出(java.lang.OutOfMemoryError: Java heap space)栈深度不够( java.lang.StackOverflowError)栈线程数不够(java.lang.OutOfMemoryError: unable to create new native thread)元空间溢出(java.lang.OutOfMemoryError: Metaspace)1、元空间溢出(java.lang.OutOfMemoryError: Metaspace)Metaspace元空间主要是存储类的元数据信息,各种类描述信息,比如类名、属性、方法、访问限制等,按照一定的结构存储在Metaspace里 。一般来说,元空间大小是固定不变的 。在出现溢出后,首先通过命令或监控工具(如下图)查看元空间大小,再检查是否-XX:MaxMetaspaceSize配置太小导致 。
文章插图

文章插图

文章插图
如果发现元空间大小是持续上涨的 , 则需要检查代码是否存在大量的反射类加载、动态代理生成的类加载等导致 。可以通过-XX:+TraceClassLoading -XX:+TraceClassUnloading记录下类的加载和卸载情况,反推具体问题代码 。

文章插图
2、栈深度不够(java.lang.StackOverflowError)引发StackOverFlowError的常见原因有:
- 无限循环递归调用
- 同一时间执行大量方法,资源耗尽
- 方法中声明大量局部变量
- 其它消耗栈资源的方法
- xss配置太小导致
/** * VM Args: -Xss128k */public class JavaStackSOF {private int stackLength = 1;public void stackLeak() {stackLength++;stackLeak();}public static void main(String[] args) {JavaStackSOF oom = new JavaStackSOF();try{oom.stackLeak();}catch(Throwable e) {System.out.println("stack length:" + oom.stackLength);throw e;}}}
stack length:2101Exception in thread "main" java.lang.StackOverflowErrorat com.sandy.jvm.chapter02.JavaStackSOF.stackLeak(JavaStackSOF.java:13)at com.sandy.jvm.chapter02.JavaStackSOF.stackLeak(JavaStackSOF.java:14)at com.sandy.jvm.chapter02.JavaStackSOF.stackLeak(JavaStackSOF.java:14)
3、栈线程数不够(java.lang.OutOfMemoryError: unable to create new native thread)这类错误目前在生成系统只遇到过一次 , 原因是:linux系统中非root用户默认创建线程数最多是1024 。解决办法是修改文件:/etc/security/limits.d/90-nproc.conf还有一种情况是-xss配置太大 , 那么操作系统可创建的最大线程数太小导致,一般除非误操作是不会出现此问题的 。
推荐阅读
- java中GC的日志认识详解
- Learning Records JavaScript进阶
- 31 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android系统中Flutter应用程序的包
- iphone13系列电池容量_iphone13系列续航对比
- 红魔手机6SPro多少钱_红魔手机6SPro价格多少
- 元芳你怎么看怎么幽默回复(神回复系列搞笑评论)
- 《上传那些事儿之Nest与Koa》——文件格式怎么了!
- 4 Java多线程:ThreadLocal
- C++算法之旅、02 从木棒切割问题领悟二分法精髓
- 金铲铲之战花好月圆传送门怎么获取