虚拟机知识点

1.java程序运行的一个全过程:
    
     java编译环境

     java源代码(.class文件) 通过   java编译器   java字节码(.class文件)通过 字节码本地或网络  

      java平台运行期环境
     
      类装载器字节码的验证 (解释  编译 运行期系统)(java虚拟机)
     
     
开始试图执行类HelloApp的main方法,发现该类并没有被装载,也就是说虚拟机当前不包含该类的二进制代表,于是虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个进程失败,则抛出一个异常。类被装载后同时在main方法被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段:检验,准备和解析。检验检查被装载的主类的符号和语义,准备则创建类或接口的静态域以及把这些域初始化为标准的默认值,解析负责检查主类对其它类或接口的符号引用,在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。 


2.判断对象是否该被回收算法

1.引用计数算法

  每当引用时 计数器+1 引用失效 计数器-1 为0时表示不在引用 (很难解决对象间循环使用问题)
2.根搜索算法
  
   gc root作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链, 当一个对象到gc    root,没有任何引用链相连时,则证明这个对象是不可用的,搜索后发现没有与gc root相连接的引用链,就会第一次标记,并看此对象需要执行finalize()方法,当第二次标记时 对象会被回收

3.java虚拟机基本垃圾回收算法

1.标记-删除

  分两阶段 第一阶段 从根节点开始标记所有被引用的对象 第二阶段 便利整个堆 把为标记的对象清除
返回空闲列表
  不足:收集暂停可能会很长,在清除阶段整个堆是可以访问的,因为很多对象可能成为垃圾,这意思着收集器花费大量精力去检查和处理垃圾。还容易产生碎片,这会产生区域性问题并可以造成分配失败。此算法需要暂停整个应用,同时会产生内存碎片

2.复制

  划分两个相同的区域,每次只使用一个区域,垃圾回收时便利被使用区域,把正在使用的对象复制到另一个区域中。
  不足:需要两倍空间

3.标记-整理
  结合标记清楚和复制算法的优点。第一阶段 从根节点开始标记所有被引用的对象 第二阶段 便利整个堆 把为标记的对象清除并且把适用对象压缩到堆的其中一块,按顺序排放。

4,增量收集
  
  实施垃圾回收算法(应用进行同时进行垃圾回收)

5.分代

  分为 年轻带  年老带 持久带 
  年轻带:分为三个区 一个Eden两个Survivor 大部分对象在Eden中生成 ,当Eden去满了的时候,还存活的对象放入到第一个Survivor区内,满时放入另一个Survivor中,当这个区满时将上一个Survivor复制过来的存活对象复制到年老区
  
  年老带:存放生命周期唱的对象

  持久带:存放静态文件,如java类、方法等 对垃圾回收影响不大 但是有些应用可能会动态生成或调用一些class 这种时候需要设置一个比较大的持久带空间来存放这些运行过程中新增的类

6.gc 分类

  1.Scavenge GC
    新对象生成时,在Eden申请空间失败时触发,对Eden进行GC清除非存活对象

  2.full GC
    整个堆的垃圾回收 触发条件 年老带被写满 持久带被写满 System.gc()被显示调用  上一次GC之后Heap的各域分配策略动态变化      


4.垃圾收集算法

 1.串行收集器  单线程操作 适合于但处理器机器 速度快 数据量小(100m左右)响应时间无要求

 2.并行收集器  对年轻带进行并行处理 提高年轻带垃圾回收的效率 适用于多线程处理器机器 应用响   应时间会加长
  
 3.并发收集器  垃圾回收之暂停较少的时间 适用于对响应时间要求比较高的中 大规模应用 可以保证大部分工作都并发进行

猜你喜欢

转载自blog.csdn.net/weixin_42034166/article/details/82968654
今日推荐