资讯专栏INFORMATION COLUMN

JVM入门系列-JVM总览

娣辩孩 / 1935人阅读

摘要:模板解释器和字节码解释器差不多,不一样的地方在于直接把对应的指令集转成本地代码编译器可以针对热点代码优化,执行开销较大,但是能够针对性的优化,效率最高垃圾收集器负责回收不再使用的对象,释放和整理内存简称。

(原发于知乎, 定期同步至segmentfault, 原文地址:知乎-JVM入门系列-JVM总览)
Java宣称Write Once Run Everywhere,这意味着在一个平台上开发的java程序可以不加修改的运行在其他平台上面。能达成这个功能依赖的就是jvm屏蔽了底层的差异。

当我们编写.java文件之后,编译器会将其编译成同名的.class文件。class文件是一个字节码文件,jvm会加载并且执行它,下方就是整体框图。


(图片来源:wikipedia-Java virtual machine)

如图所示,虚拟机主要可以被分为三块:

类加载系统

运行时数据区

执行引擎

类加载系统Class Loader Subsystem

类加载系统负责验证并且加载.class文件,主要可以划分为三个步骤:

加载(Loading)

链接(Linking)

初始化(Initialization)

加载

类文件在这一块被加载到内存中去。类加载器(class loader)可以划分为Boot Strap class Loader, Extension class Loader, and Application class Loader

Boot Strap class Loader - 加载系统引导类( $JAVA_HOME/jre/lib))

Extension class Loader - 加载拓展类($JAVA_HOME/jre/lib/ext)

Application class Loader - 也被称为User class loader, 负责加载应用层级的类

链接

Verify - 验证字节码是否正确

Prepare - 在这一步分配静态变量并且设置默认值

Resolve - 所有的符号引用都会被替换成指向方法区的原始引用

初始化

这是类加载的最后一步,所有的静态变量都会被赋值。执行顺序是从上到下的,由父类到子类。

运行时数据区 Runtime Data Area

运行时数据区可以划分为5个区域

方法区 - 保存类数据信息,包括成员信息,父类和接口信息,运行时常量池等,jvm共享

堆区 - 保存所有的对象信息,jvm共享

栈区 - 每个线程独有自己的栈,生命周期和线程一致

PC寄存器区 - 储存当前执行指令的地址,如果执行的是是本地方法pc为null

本地方法栈区 - 和栈区一致,只不过存放的是本地方法信息

执行引擎 Execution Engine

执行引擎负责执行代码,执行引擎会依次读取字节码并且按顺序执行。一般来说可以划分为如下几个组件

字节码解释器

字节码解释器(Bytecode Interpreter),就像名字显示的一样,是用来执行字节码。优点是执行开销小,缺点是执行效率较低。

模板解释器

和字节码解释器差不多,不一样的地方在于直接把对应的指令集转成本地代码

JIT编译器

可以针对热点代码优化,执行开销较大,但是能够针对性的优化,效率最高

垃圾收集器

负责回收不再使用的对象,释放和整理内存

Java Native Interface

Java native interface, 简称JNI。暴露了本地方法的接口,使得java可以调用本地方法

Native Method Libraries

本地方法库

参考:

Java_virtual_machine

The JVM Architecture Explained

How JVM Works – JVM Architecture?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70277.html

相关文章

  • Java相关

    摘要:本文是作者自己对中线程的状态线程间协作相关使用的理解与总结,不对之处,望指出,共勉。当中的的数目而不是已占用的位置数大于集合番一文通版集合番一文通版垃圾回收机制讲得很透彻,深入浅出。 一小时搞明白自定义注解 Annotation(注解)就是 Java 提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解) 是一个接口,程序可以通过...

    wangtdgoodluck 评论0 收藏0
  • 利用MAT分析JVM内存问题,从入门到精通(二)

    摘要:用于列举最近分析过的文件常用功能栏,从左到右依次是概览类直方图支配树查询线程视图报告相关详细功能。针对那些占用堆内存超过整个堆内存大小的组件做一系列的分析,例如保留集合潜在的内存浪费问题等其他问题。 上一篇文章MAT入门到精通(一)介绍了MAT的使用场景和基本概念,这篇文章开始介绍MAT的基本功能,后面还有两篇,一篇是MAT的高级功能,另一篇是MAT实战案例分析。 三、欢迎页 使用MA...

    amuqiao 评论0 收藏0
  • Java进阶之路

    摘要:探索专为而设计的将探讨进行了何种改进,以及这些改进背后的原因。关于最友好的文章进阶前言之前就写过一篇关于最友好的文章反响很不错,由于那篇文章的定位就是简单友好,因此尽可能的摒弃复杂的概念,只抓住关键的东西来讲,以保证大家都能看懂。 周月切换日历 一个可以进行周月切换的日历,左右滑动的切换月份,上下滑动可以进行周,月不同的视图切换,可以进行事件的标记,以及节假日的显示,功能丰富 Andr...

    sushi 评论0 收藏0
  • Java深入-框架技巧

    摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...

    chengtao1633 评论0 收藏0

发表评论

0条评论

娣辩孩

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<