JVM

  • 1.java内存的申请有两种:
    • 静态内存(系统一次性分配比如int类型变量 ,java栈。pcRegister,那体侧method随线程的状态改变而改变,内存定量回收)
    • 动态内存(javaGC主要针对此项内存,java堆,方法区)
  • 垃圾检测、回收算法
    • 检测垃圾的方式:
      • 引用计数器(每当对象呗调用 计数器加1;引用失败减1);初始化为0
      • 可达性分析算法(以根集对象为起始点进行搜索,如果有对象不可达的话,即是垃圾对象。这里的根集一般包括java栈中引用的对象、方法区常良池中引用的对象从GC Roots利用图论中的可达性原理来判断,内存是否需要被回收
        • 以下对象会被认为是root对象:
          • 被启动类(bootstrap加载器)加载的类和创建的对象
          • jvm运行时方法区类静态变量(static)引用的对象
          • jvm运行时方法去常量池引用的对象
          • jvm当前运行线程中的虚拟机栈变量表引用的对象
          • 本地方法栈中(jni)引用的对象
        • java里面有四种应用关系,从强到弱分别为:
          • Strong Reference(强引用) –>Weak Reference (弱引用) -> Soft Reference(软引用) – > Phantom Reference(引用)
          • Strong Reference : 只有在引用对象root不可达的情况下才会标识为可回收,垃圾回收才可能进行回收
            • 如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。
          • Soft Reference : 无论其引用的对象是否root可达,在响应内存需要时,由垃圾回收判断是否需要回收。
            • 可以使用 -Xmx 参数来限制JVM可用的内存。由于软引用所指向的对象可能被回收掉,在通过get方法来获取软引用所实际指向的对象的时候,总是要检查该对象是否还存活。
          • Weak Reference :用来描述非必需对象。即使在root算法中 其引用的对象root可达到,只能生存到下一次垃圾回收之前。
            • 弱引用最常见的用处是在集合类中
            • 在Java集合中有一种特殊的Map类型—WeakHashMap,在这种Map中存放了键对象的弱引用
            • WeakHashMap 用弱引用承载映射键,这使得应用程序不再使用键对象时它们可以被垃圾收集,get() 实现可以根据 WeakReference.get() 是否返回 null 来区分死的映射和活的映射。但是这只是防止 Map 的内存消耗在应用程序的生命周期中不断增加所需要做的工作的一半,还需要做一些工作以便在键对象被收集后从 Map 中删除死项。否则,Map 会充满对应于死键的项。虽然这对于应用程序是不可见的,但是它仍然会造成应用程序耗尽内存。
            • 引用队列是垃圾收集器向应用程序返回关于对象生命周期的信息的主要方法。弱引用有个构造函数取引用队列作为参数。如果用关联的引用队列创建弱引用,在弱引用对象成为 GC 候选对象时,这个引用对象就在引用清除后加入到引用队列中(具体参考上文软引用示例)。
            • WeakHashMap 有一个名为 expungeStaleEntries() 的私有方法,大多数 Map 操作中会调用它,它去掉引用队列中所有失效的引用,并删除关联的映射。
          • Phantom Reference :无法通过虚引用获得一个对象的实例,设置虚引用的目的就是能在这个对象被收集器回收时收到一个系统通知。
    • 常用的垃圾回收
      • 标记--清除(不足:效率低产生大量的碎片)
      • 复制(占用空间翻倍)
      • 标记--整理(融合以上两种算法,)
      • 分代收集算法
        • 年轻代(Young Generation)、
          • 分为3个区:Enden Survivor(From和To)用复制算法
        • 年老代(Old Generation)、标记--整理算法
        • 持久代(Permanent Generation)。其中持久代主要存放的是类信息方法等
      • CMS并发收集器
        • CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器是基于“标记-清除”算法实现的,CMS收集器的内存回收过程是与用户线程一起并发执行的。整个收集过程大致分为4个步骤
        • ①.初始标记(CMS initial mark)
        • ②.并发标记(CMS concurrenr mark)
        • ③.重新标记(CMS remark)
        • ④.并发清除(CMS concurrent sweep)

        • 参数
          描述
          -XX:+UseSerialGC
          Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收
          -XX:+UseParNewGC
          打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收
          -XX:+UseConcMarkSweepGC
          使用ParNew + CMS +  Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。
          -XX:+UseParallelGC
          Jvm运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge +  Serial Old的收集器组合进行回收
          -XX:+UseParallelOldGC
          使用Parallel Scavenge +  Parallel Old的收集器组合进行回收
          -XX:SurvivorRatio
          新生代中Eden区域与Survivor区域的容量比值,默认为8,代表Eden:Subrvivor = 8:1
          -XX:PretenureSizeThreshold
          直接晋升到老年代对象的大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
          -XX:MaxTenuringThreshold
          晋升到老年代的对象年龄,每次Minor GC之后,年龄就加1,当超过这个参数的值时进入老年代
          -XX:UseAdaptiveSizePolicy
          动态调整java堆中各个区域的大小以及进入老年代的年龄
          -XX:+HandlePromotionFailure
          是否允许新生代收集担保,进行一次minor gc后, 另一块Survivor空间不足时,将直接会在老年代中保留
          -XX:ParallelGCThreads
          设置并行GC进行内存回收的线程数
          -XX:GCTimeRatio
          GC时间占总时间的比列,默认值为99,即允许1%的GC时间,仅在使用Parallel Scavenge 收集器时有效
          -XX:MaxGCPauseMillis
          设置GC的最大停顿时间,在Parallel Scavenge 收集器下有效
          -XX:CMSInitiatingOccupancyFraction
          设置CMS收集器在老年代空间被使用多少后出发垃圾收集,默认值为68%,仅在CMS收集器时有效,-XX:CMSInitiatingOccupancyFraction=70
          -XX:+UseCMSCompactAtFullCollection
          由于CMS收集器会产生碎片,此参数设置在垃圾收集器后是否需要一次内存碎片整理过程,仅在CMS收集器时有效
          -XX:+CMSFullGCBeforeCompaction
          设置CMS收集器在进行若干次垃圾收集后再进行一次内存碎片整理过程,通常与UseCMSCompactAtFullCollection参数一起使用
          -XX:+UseFastAccessorMethods
          原始类型优化
          -XX:+DisableExplicitGC
          是否关闭手动System.gc
          -XX:+CMSParallelRemarkEnabled
          降低标记停顿
          -XX:LargePageSizeInBytes
          内存页的大小不可设置过大,会影响Perm的大小,-XX:LargePageSizeInBytes=128m
            

          Client、Server模式默认GC
            
           
          新生代GC方式
          老年代和持久代GC方式
          Client
          Serial 串行GC
          Serial Old 串行GC
          Server
          Parallel Scavenge  并行回收GC
          Parallel Old 并行GC
             
          Sun/oracle JDK GC组合方式
            
           
          新生代GC方式
          老年代和持久代GC方式
          -XX:+UseSerialGC
          Serial 串行GC
          Serial Old 串行GC
          -XX:+UseParallelGC
          Parallel Scavenge  并行回收GC
          Serial Old  并行GC
          -XX:+UseConcMarkSweepGC
          ParNew 并行GC
          CMS 并发GC 
           
          当出现“Concurrent Mode Failure”时
           
          采用Serial Old 串行GC
          -XX:+UseParNewGC
          ParNew 并行GC
          Serial Old 串行GC
          -XX:+UseParallelOldGC
          Parallel Scavenge  并行回收GC
          Parallel Old 并行GC
          -XX:+UseConcMarkSweepGC
          Serial 串行GC
          CMS 并发GC 
          -XX:+UseParNewGC
           
          当出现“Concurrent Mode Failure”时
            
          采用Serial Old 串行GC


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值