• 垃圾收集器(GC)


    堆分区:所有new的对象都会存放在堆中

         > 新生代(Young Generation):存放生命周期短的对象,具体还分为Eden和Survivor两个区,其中Survivor分为From Space和To Space;
         > 旧生代(Old Generation):存放生命周期长的对象
         > 持久代(Permenent Generation):用于存放class字节码等

     
    JVM使用的GC算法是:分代收集
         > 频繁的收集新生代
         > 较少的收集旧生代
         > 基本不收集持久代

     
    JVM的GC机制分为:Minor GC 和 Full GC
         > Minor GC: 即普通GC,负责收集新生代里所有对象,会把Eden里所有活着的对象复制到Survivor里,如果Survivor放不下,则把Survivor里活着的对象放入旧生代里
         > Full GC:会对新生代和旧生代进行收集,算法不同效率会低于GC。显式调用System.gc()时,就是进行Full GC。
         > 触发条件:Eden满了触发Minor GC;有新对象进入旧生代时,旧生代空间不足则进行Full GC

     
    JVM的清理算法:
         > 引用计数法(早期JVM):JVM会为对象的引用数进行计数,创建则添加,引用超出范围则删减,当计数为0时,则可以收集
         > 对象引用遍历:JVM会遍历所有根对象,根据对象图递归确定可到达对象,如果某对象实例可以从根对象到达,则将其标记,称为标记对象;在执行收集阶段,只需要简单的扫描堆栈,删除所有未标记对象即可。一般在之后还会进行压缩,以便为新的对象腾出空间。
      > 复制清理法

     
    JVM如何清理一个对象:
         > 新生代:采用复制清理法,扫描后把可到达的对象复制到未使用的区域,如survivor里,然后清楚Eden里所有对象
         > 旧生代:采用标记清理然后压缩,内容见对象引用遍历。
         > 机制:串行和并行两种,串行使用于单线程,单cpu;并行使用于多线程,多核cpu。
     

    调优:
         >使用调优:尽早将不用的对象赋值null,而不是等到退出生命周期自动赋值;少用finalize(),会增大GC工作量;当程序等待时,手动执行system.gc();
         >虚拟机优化选项:网上查询
  • 相关阅读:
    如何只用5分钟完成数据 列表、创建页面
    从零开始搭建一个PaaS平台
    C# 多线程猜想
    使用Golang + lua实现一个值班机器人
    如何使用Golang实现一个API网关
    记一次Windb死锁排查
    怎样在PaaS平台上搭建一个会自动关闭的会议室
    JS Object To C# ASP.Net ModelBind
    重写了一遍授权思路
    授权详细设计
  • 原文地址:https://www.cnblogs.com/Pjson/p/8782937.html
Copyright © 2020-2023  润新知