Java虚拟机学习

来源:互联网 发布:如何解析网址域名 编辑:程序博客网 时间:2024/06/05 22:54

参考书籍:《深入了解Java虚拟机》

----2017/9/24

1.运行时数据区域

a.程序计数器
  字节码解释器通过改变这个计数器的值来选择下一条需要执行的字节码指令,包括分支、循环、跳转、异常处理。Java多线程是通过线程轮流切换来实现的,每个线程都有独立的线程计数器。这些计数器能够让线程切换后回到正确的执行位置
b.Java虚拟机栈
  java虚拟机栈描述的是Java方法的内存模型,每个Java方法都执行的时候都会创建一个栈帧,用来存储局部变量表(方法参数、局部变量、对象引用、返回地址)、操作数栈、动态链接、方法出口等信息
c.本地方法栈

  与Java虚拟机栈类似,不过是Native方法的内存模型

d.Java堆

  Java堆用来为对象实例和数组分配内存,包括Eden空间、From Survivor空间、To Survivor空间等等,垃圾收集器主要管理这个区域

e.方法区

  方法区存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等,极少内存回收


线程私有的内存包括程序计数器、Java虚拟机栈、本地方法栈

线程共享的内存包括Java堆和方法区


2.对象

a.对象的创建
  1).若是常量池中没有这个类的符号,则第一步是类加载
  2).为新对象分配内存,从Java堆中分配,分配方式有两种:指针碰撞(内存规整的)和空闲列表(内存不规整)
  3).将分配到的内存全部初始化为零值
  4).设置对象头,包括对象的哈希码、对象GC分代年龄、锁状态、线程持有的锁、偏向线程ID、偏向时间戳等(Mark Word)以及类型指针,即指向对象的类元数据的指针
  5).执行<init>方法
b.对象的访问定位
  1)通过句柄访问对象访问对象
2.通过直接指针访问对象
访问对象
Sun HotSpot 采用第二种方式

3.垃圾收集器
a.判断对象是否死亡
  1)引用计数器(无法解决相互循环引用的情况)
  2)可达性分析:当一个对象到GC Roots没有任何引用链相连,这个对象就可以回收
b.引用分类
  1)强引用:只要强引用还在,垃圾收集器就不会回收被引用的对象
  2)软引用:还有用但非必须的对象,当要发生内存溢出前,牺牲这些对象
  3)弱引用:无论内存是否足够,都会回收这些对象
  4)虚引用:设置的目的是在这个对象被回收时收到一个系统通知
c.垃圾收集算法
  1)标记清除算法(Mark Sweep):将需要回收的对象标记,标记完成后统一回收,缺点:产生大量的不连续空间碎片、效率低。效率低
  2)复制算法(Copy):将不需要回收的对象复制到另一块内存,清除原先的那一整块,缺点:空间牺牲大。由于对象大部分存活期不久,可以设置Eden空间和2块survivor空间,复制的时候把存活的对象复制到未使用的survivor空间,清理Eden空间和另一块survivor空间。
  3)标记整理算法(Mark Compact):将需要回收的对象标记,标记完成后将存活的对象移动到一端,清理剩下的空间
d.垃圾收集器
大大所多

  1)serial收集器:单线程、STW(Stop The World,即停止用户线程只进行GC线程),新生代采用复制算法,老年代采用标记整理算法,适合单CPU环境
大大所多

  2)parnew收集器:serial的多线程版本,新生代收集器,唯一的可以和CMS(Concurrent Mark Sweep)收集器配合使用,适合多CPU环境
大声道
  3)parallel scavenge收集器:新生代收集器、STW,关注吞吐量(运行用户代码时间在总时间里的比例),复制算法
   4)parallel old收集器:老年代收集器、STW,和parallel scavenge配合使用,组成完整的吞吐量优先收集器
大大所多
  5)CMS(Concurrent Mark Sweep)收集器:包含四个步骤:初始标记(STW)、并发标记、重新标记(STW)、并发清除,第一个实现并发GC的收集器,缺点:对CPU资源敏感、无法处理浮动垃圾、产生大量空间碎片(Mark Sweep)(Mark Sweep)

  6)G1(Garbage-First)收集器:并行与并发,分代收集、空间整合(整体基于标记整理,局部采用复制算法)、可预测的停顿。将Java堆分成大小不一的Region,优先回收价值最大的Region(Garbage-First)。步骤:初始标记( STW)、并发标记、最终标记(STW)、筛选回收(STW)
筛选回收(STW)
4.内存分配
  1)对象优先在Eden区分配,当Eden区没有足够的空间时,发生一次新生代GC(minor GC)
  2)超过阙值大小的对象直接进入老年代,阙值设置:-XX:PretenuredSizeThreshold
  3)长期存活的对象进入老年代,对象年龄(每熬过一次minor GC即增加一岁,初始年龄为1)超过-XX:MaxTenuringThreshold设置的阙值时直接进入老年代
  4)动态年龄判定,survivor空间中年龄相同的对象总和大于survivor空间大小的一半时,那么年龄大于等于这些对象的年龄的对象进入老年代
原创粉丝点击