关于JVM的知识和参数的调优

关于JVM的知识和参数的调优

  • 概念:
    • JRE中的核心概念就是JVM
    • JMM是java内存模型
    • 三大核心:
      • JVM的类加载机制
      • jvm的运行时数据区
      • jvm的垃圾回收机制
  • 类加载器:在jvm启动或者在类运行时将需要的class加载到jvm中
  • 执行引擎:负责执行class文件中包含的字节码指令
  • 内存区:是在jvm运行的时候操作所分配的内存区。运行时内存主要分为5部分:方法区,堆内区,虚拟机栈,本地方法栈,程序计数器
  • 本地方法接口:主要调用c或c++实现的本地方法及返回结果。
  • 进一步的细分运行时数据区
    • 方法区 永久代
    • 堆内区 1.年轻代 2.老年代
    • 栈(私有 栈)1.本地方法栈 2.程序计数器 3.java虚拟机栈
  • JVM各区域的作用
    • 堆:就是程序运行时创建的各种对象,java堆是垃圾管理的主要区域,因此也叫GC堆。
    • 方法区:是线程共享的通常用来保存装载类的元结构信息。主要用于存储虚拟机加载的类信息,常量,静态变量以及编译器编译后的代码等数据。
    • 程序计数器:当前线程所执行的字节码的行号指示器。
  • 举例说明:
    • 方法栈深度溢出

        public class Heap {
            public static void main(String[] args) {        
               test();
            }
            /**
             * 方法栈深度溢出
             */
            public static void test() {
                test();
            }
        }
      
    • 堆内存空间不足:

        //idea中设置:VM opention:-Xmx500m 可以尽快抛出异常
        public class Heap {
            public static void main(String[] args) {
                /**
                 * OutOfMemoryError:Java heap space
                 */
                ArrayList list=new ArrayList();
                while(true)
                {
                    list.add(new Heap());
                }  
            }
        }
      
  • 垃圾回收
    • 吞吐率:(运行时间-垃圾回收时间)/运行时间
    • 最大停顿时长:垃圾回收的次数中最大的时间
    • 对一个对象判断是否存活两种方式:1.引用计数 2.可达性分析
    • GC分为新生代GC MinorGC 和老年代GC Fill GC
  • 四种垃圾回收算法:
    • 标记清楚算法:算法分为标记和清除两个阶段,首先标记处所有要回收的对象,在标记完成之后统一收回别标记的对象。缺点就是效率不高,而且会产生大量的内存碎片。
    • 复制算法:将可用内存容量划分为大小的两块,每次只使用其中一块,当着一块内存用完了就将活着的对象复制到另一块上,把这一块完全清除。缺点就是使用的内存大小缩小为原来的一半,长久存在对象则导致其效率变慢。(年轻代)
    • 标记整理算法:是算法和标记清除一样,但是后续的步骤不是直接对可回收的对象进行清除,而是让活着的对象都向一端移动,然后直接清理掉端边界以外的内存。(年老代)
    • 分代收集算法:根据不同代的特性选择适合的垃圾收集算法。
  • 五种垃圾收集器:
    • Serial收集器又叫串行收集器:最古老的最稳定的单线程的收集器。缺点:就是会产生服务暂停,也就是停顿时间过长。
      使用-XX:+UseSerialGC来开启。
    • ParNew收集器:Serial收集器的多线程版本。-XX:UseParNewGC 开启这种收集器 -XX:ParallelGCThreads 限制线程数量。也会发生挺顿但还是比串行收集器停顿的时间短。
    • Parallel收集器:这个收集器更加注重系统的吞吐量。-XX:UseParallelGC 开启这种收集器 -XX:UseParallelOld 开启老年代使用Parallel收集器-XX:GCTimeRatio:指定运行应用代码的时间占总时间的比例 默认为99。-XX:MaxGCPauseMillis:设置GC的最大停顿时间
    • CMS收集器:以获取最短回收时间停顿为目标的收集器。步骤分为4步:1.初始标记 2.并发标记 3.重新标记 4.并发清除
      -XX:UseConcMarkSweepGC 使用cms收集器-XX:UseCMSCompactAtFullCollection:FullGC 之后进行一次碎片整理。-XX:+CMSFullGCsBeforeCompaction 设置进行几次碎片整理。-XX:ParallelCMSThreads:设置线程的数量。
      -G1收集器:采用标记整理算法进行垃圾回收。-XX:UseG1GC使用G1垃圾回收器
  • 设置JVM的参数列表
    • -Xmx3550m:最大对内存为3550m
    • -Xms3550m:初始堆内存为3550m
    • Xmn2g:设置年轻代大小为2g
    • Xss1m:设置每个线程的堆栈的内存大小
    • -XX:NewRation=4:设置年轻代和年老代的比例
    • -XX:SurvivorRatio=4:设置年轻代中Eden与Survivor的大小比值
    • -XX:MaxPermSize=16M;设置持久代的大小
    • -XX:MaxTenuringThreshold=15:设置垃圾最大年龄在from Servivor 和to Servivor中15次后把这个对象放到old中
  • 垃圾回收统计信息
    • XX:+PrintGC
    • XX:+PrintGCDetails
    • XX:+PrintGCTimeStamps
    • Xloggc:filename
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值