• JVM(五)回收机制


     1.对象的引用

    JDK1.2之后,对象的引用分为了四种情况    强引用:Object obj = new Object();只要强引用还在,垃圾回收器就永远不会收集被引用的对象。    软引用:SoftReference 它用来描述一下可能还有用,但并非必须引用,在系统内存不够时,会被回收。    弱引用:WeakReference ,垃圾回收器工作时,不管内存够不够,都会被回收。    虚引用:PhantomReference.

    2.怎么判断是否是一个垃圾对象  

      ①引用计数算法  

      ②可达性(根搜索)算法     虚拟机栈(栈帧中本地变量表)引用的对象      方法区中的类静态属性引用的对象    方法区中常量引用的对象     本地方法栈中JNI的引用对象。  

    3.垃圾回收的算法    

    ①标记-清除算法      标记所有要回收的对象,然后清除     缺点:效率不高     不连续的内存碎片,  

      ②复制算法     对标记清除的改进,将可用内存分为了大小相等的两块,每次只使用一半,当一块用完了,将还活着的对象复制到另外一快上面,然后把已经使用过的空间一次清理掉     优点: 每次只对一块内存回收,运行高效      不用考虑内存碎片,      只需要移动栈顶指针,      实现简单     缺点:可一次性分配的最大内存减小了一半。   

     ③标记-整理算法     赋值算法适合于新生代,在老年代中,对象存活率高,如果执行过多的赋值操作,效率将会降低,所以老年代一般选标记-整理算法。     与标记清除一样,只是标记后的处理情况不同,不直接对可回收对象进行清除,而是让所有的对象移动到一端,然后清除。   

     ④分代收集     根据对象的存活周期不同将内存划分为好几块,一般分为新生代和老年代,     新生代:大量对象死去,少量存活,复制算法收集。     老年代:存活率高,标记清除或者标记整理。  

    4.垃圾回收分析    

    堆中:年轻代(Eden和Survivor)、年老代    年轻代:MinorGc     年老代是Major GC,     FULL GC 是对整个堆来说的,也包括对永生代(持久代方法区)的回收,再1.8中已经没有永生代了,     FULL GC通常会引起一次MinorGC,但不是绝对的。

       ①明确三点:     

     对象优先分配在Eden      

    大对象直接进入老年代     

    长期存活对象进入老年代    

    ②对回收策略说明两点    

     a.新生代GC:因为大部分对象具有朝生夕灭特性,因此MinorGC非常频繁     

    b.老年代GC:发生在老年代的GC出现MajorGC,会伴随至少一次MinorGC。由于老年代的对象生命周期长,因此MajorGC并不频繁,一般都是满了才进行Full GC      速度比MainorGC慢10倍以上,,如果分配了Direct Memory,在老年代Full GC时,会顺便清理Direct Memory的对象。   案例分析??????????    

    5.性能调优  

      ①通过给Java堆设置超大堆内存来提升服务器的响应速度,但分配超大堆的前提是有把握把应用程序的FullGC频率控制得,因为一次FullGC的时间造成比较长的时间停顿,而控制Full GC的频率是      关键是保证应用程序中绝大多数的对象生存周期不应太长,尤其不能产生批量、周期长的大对象,这样才可以保证老年代的稳定。  

      ②Direct Memory在堆内存外分配,

        ③线程堆栈:-Xss调整  

      ④Socket缓冲区:每个Socket缓冲区有Receive和Send两个缓冲区,分别占用37KB和25KB的内存,如果无法分配,抛IOException:Too many open files异常   

     ⑤JNI代码:本地库使用的内存不在堆中。    ⑥虚拟机和GC:虚拟机和GC的执行也会消耗一定的内存。

    天助自助者
  • 相关阅读:
    DevExpress v17.2新版亮点—ASP.NET篇(一)
    使用MyEclipse将HTML5移动项目迁移到PhoneGap(一)
    DevExpress v17.2新版亮点—WPF篇(七)
    什么是SpringBoot?
    application.yml中常用参数设置
    什么是MyBatis?
    什么是Spring?
    项目访问路径去掉默认的项目名
    StringUtils常用方法介绍
    Spring学习----自动装配@Resource、@Autowired、@Qualifier
  • 原文地址:https://www.cnblogs.com/ZeGod/p/9964837.html
Copyright © 2020-2023  润新知