您的位置 首页 java

Java虚拟机结构详解,各区域功能解析

Java虚拟机

java虚拟机(java virtual machine,JVM),一种能够运行java字节码的虚拟机。作为一种编程语言的虚拟机,实际上不只是专用于Java语言,只要生成的编译文件匹配JVM对加载编译文件格式要求,任何语言都可以由JVM编译运行。

JVM的基本结构

JVM由三个主要的子系统构成类加载子系统

运行时数据区(内存结构)

执行引擎

类加载机制 类的生命周期

1. 加载 将.class文件从磁盘读到内存

2. 连接

2.1 验证 验证字节码文件的正确性(魔数)

2.2 准备 给类的静态变量分配内存,并赋予默认值

2.3 解析 类装载器装入类所引用的其它所有类(静态链接)

3. 初始化 为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,此处赋予的才是程序 编写者为变量分配的真正的初始值,执行静态代码块

4. 使用

5. 卸载

类加载器的种类

启动类加载器(Bootstrap ClassLoader) 负责加载JRE的核心类库,如JRE目标下的rt.jar,charsets.jar等

扩展类加载器(Extension ClassLoader) 负责加载JRE扩展目录ext中jar类包

系统类加载器(Application ClassLoader) 负责加载ClassPath路径下的类包

用户自定义加载器(User ClassLoader) 负责加载用户自定义路径下的类包

类加载机制 全盘负责委托机制 当一个ClassLoader加载一个类的时候,除非显示的使用另一个ClassLoader,该类所依赖和引用的类也由这个 ClassLoader载入

双亲委派机制 指先委托父类加载器寻找目标类,在找不到的情况下载自己的路径中查找并载入目标类

双亲委派模式的优势

沙箱安全机制:比如自己写的String.class类不会被加载,这样可以防止核心库被随意篡改

避免类的重复加载:当父ClassLoader已经加载了该类的时候,就不需要子ClassLoader再加载一次 运行时数据区(内存结构)

1. 方法区(Method Area)(永久带/持久带jdk1.8以前,元空间) 类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义。简单来说,所有定义的方法的 信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中,虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是为了和Java的堆区分开(jdk1.8以前hotspot虚拟机叫永久代、持久代,jdk1.8时叫元空间)

2. 堆(Heap) 虚拟机启动时自动分配创建,用于存放对象的实例,几乎所有对象都在堆上分配内存,当对象无法在该空间申请到内 存是将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。

2.1 新生代(Young Generation) 类出生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集, 结束生命。 新生代分为两部分:伊甸区(Eden space)和幸存者区(Survivor space),所有的类都是在伊甸区被new出来的。幸存区又分为From和To区。当Eden区的空间用完是,程序又需要创建对象,JVM的垃圾回收器将Eden区进行垃圾回 收(Minor GC),将Eden区中的不再被其它对象应用的对象进行销毁。然后将Eden区中剩余的对象移到From Survivor区。若From Survivor区也满了,再对该区进行垃圾回收,然后移动到To Survivor区。

2.2 老年代(Old Generation)

新生代经过多次GC仍然存货的对象移动到老年区。若老年代也满了,这时候将发生Major GC(也可以叫Full GC), 进行老年区的内存清理。若老年区执行了Full GC之后发现依然无法进行对象的保存,就会抛出OOM(OutOfMemoryError)异常

2.3元空间(MetaSpace)

在JDK1.8之后,元空间替代了永久代,它是对JVM规范中方法区的实现,区别在于元数据区不在虚拟机当中,而是用 的本地内存,永久代在虚拟机当中,永久代逻辑结构上也属于堆,但是物理上不属于。

为什么移除了永久代

参考官方解释

大概意思是移除永久代是为融合HotSpot与 JRockit而做出的努力,因为JRockit没有永久代,不需要配置永久代。

3. 栈(Stack)

Java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)不存在垃圾回收问题,只要线程一结束该栈就释放,生命周期和线程一 致

4.本地方法栈(NativeMethodStack)

和栈作用很相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行native方法服务。登记native 方法,在Execution Engine执行时加载本地方法库

5.程序计数器(ProgramCounterRegister)

就是一个指针,指向方法区中的方法字节码(用来存储指向吓一跳指令的地址,也即将要执行的指令代码),由执行 引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计

GC算法和收集器 如何判断对象可以被回收 堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的 对象)

引用计数法 给对象添加一个引用计数器,每当有一个地方引用,计数器就加1。当引用失效,计数器就减1。任何时候计数器为0 的对象就是不可能再被使用的。

这个方法实现简单,效率高,但是目前主流的虚拟机中没有选择这个算法来管理内存,最主要的原因是它很难解决对 象之前相互循环引用的问题。所谓对象之间的相互引用问题,通过下面代码所示:除了对象a和b相互引用着对方之 外,这两个对象之间再无任何引用。但是它们因为互相引用对方,导致它们的引用计数器都不为0,于是引用计数器 法无法通知GC回收器回收它们。

可达性分析算法 这个算法的基本思想就是通过一系列的称为”GC Roots“的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连的话,则证明此对象时不可用的。 GC Roots根节点:类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等等

如何判断一个常量是废弃常量 运行时常量池主要回收的是废弃的常量。那么,我们怎么判断一个常量时废弃常量呢? 假如在常量池中存在字符串”abc”,如果当前没有任何String对象引用该字符串常量的话,就说明常量”abc“就是废弃 常量,如果这时发生内存回收的话而且有必要的话,”abc“会被系统清理出常量池。

如何判断一个类是无用的类 需要满足以下三个条件:

  • 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。
  • 加载该类的 ClassLoader 已经被回收。
  • 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。 虚拟机可以对满足上述3个条件的无用类进行回收,这里仅仅是”可以“,而并不是和对象一样不适用了就必然会被回收。

垃圾回收算法

标记-清除算法 它是最基础的收集算法,这个算法分为两个阶段,“标记”和”清除“。首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它有两个不足的地方: 1. 效率问题,标记和清除两个过程的效率都不高;

2. 空间问题,标记清除后会产生大量不连续的碎片;

复制算法 为了解决效率问题,复制算法出现了。它可以把内存分为大小相同的两块,每次只使用其中的一块。当这一块的内存 使用完后,就将还存活的对象复制到另一块区,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内 存区间的一半进行回收

标记-整理算法 根据老年代的特点提出的一种标记算法,标记过程和“标记-清除”算法一样,但是后续步骤不是直接对可回收对象进行 回收,而是让所有存活的对象向一段移动,然后直接清理掉边界以外的内存

分代收集算法

现在的商用虚拟机的垃圾收集器基本都采用”分代收集”算法,这种算法就是根据对象存活周期的不同将内存分为几 块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

在新生代中,每次收集都有大量对象死去,所以可以选择复制算法,只要付出少量对象的复制成本就可以完成每次垃 圾收集。而老年代的对象存活几率时比较高的,而且没有额外的空间对它进行分配担保,就必须选择“标记-清除”或 者“标记-整理”算法进行垃圾收集。

Java虚拟机就分享到这了,了解更多Java知识可关注微信公众号“老周扯IT”

文章来源:智云一二三科技

文章标题:Java虚拟机结构详解,各区域功能解析

文章地址:https://www.zhihuclub.com/176514.shtml

关于作者: 智云科技

热门文章

评论已关闭

11条评论

  1. Reliable information. Cheers.
    buy essays and research papers help writing research paper

  2. With thanks! An abundance of information.
    dissertation interview transcription service best dissertation writing services uk

  3. Seriously quite a lot of awesome tips.
    write an argumentative essay professional essay writer

  4. You made your stand quite clearly..
    thank you for teaching me how to read and write best write my essay website

  5. Kudos, Quite a lot of information!
    mba essay writing service best online resume writing service

  6. You actually expressed that superbly!
    affordable essay writing service writing a college admission essay

网站地图