加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

一文带你深入领略JVM

发布时间:2019-10-12 00:54:18 所属栏目:站长百科 来源:java互联网架构
导读:一、什么是JVM JVM是Java Virtual Machine(Java 假造机)的缩写,JVM是一种用于计较装备的类型,它是一个虚拟出来的计较机,是通过在现实的计较机上仿真模仿各类计较机成果来实现的。 Java说话的一个很是重要的特点就是平台无关性。而行使Java假造机是实现
副问题[/!--empirenews.page--]

一文带你深入领略JVM

一、什么是JVM

JVM是Java Virtual Machine(Java 假造机)的缩写,JVM是一种用于计较装备的类型,它是一个虚拟出来的计较机,是通过在现实的计较机上仿真模仿各类计较机成果来实现的。

Java说话的一个很是重要的特点就是平台无关性。而行使Java假造机是实现这一特点的要害。一样平常的高级说话假如要在差异的平台上运行,至少必要编译成差异的方针代码。而引入Java说话假造机后,Java说话在差异平台上运行时不必要从头编译。Java说话行使Java假造机屏障了与详细平台相干的信息,使得Java说话编译措施只需天生在Java假造机上运行的方针代码(字节码),就可以在多种平台上不加修改地运行。Java假造机在执行字节码时,把字节码表明成详细平台上的呆板指令执行。这就是Java的可以或许“一次编译,处处运行”的缘故起因。

二、JVM总体概述

JVM总体上是由类装载子体系(ClassLoader)、运行时数据区、执行引擎、垃圾网络这四个部门构成。个中我们最为存眷的运行时数据区,也就是JVM的内存部门则是由要领区(Method Area)、JAVA堆(Java Heap)、假造机栈(JVM Stack)、措施计数器、当处所法栈(Native Method Stack)这几部门构成。

三、JVM系统布局

一文带你深入领略JVM

3.1 类装载子体系

Class Loader类加载器认真加载.class文件,class文件在文件开头有特定的文件标示,而且ClassLoader认真class文件的加载等,至于它是否可以运行,则由Execution Engine抉择。

3.2 运行时数据区

栈管运行,堆管存储。JVM调优首要是优化Java堆和要领区。

3.2.1 要领区(Method Area)

要领区是各线程共享的内存地区,它用于存储已被JVM加载的类信息、常量、静态变量、运行时常量池等数据。

3.2.2 Java堆(Java Heap)

Java堆是各线程共享的内存地区,在JVM启动时建设,这块地区是JVM中最大的, 用于存储应用的工具和数组,也是GC首要的接纳区,一个 JVM 实例只存在一个堆内存,堆内存的巨细是可以调理的。类加载器读取了类文件后,必要把类、要领、常变量放到堆内存中,以利便执行器执行,堆内存分为三部门:新生代、晚年月、永世代。

声名:

  • Jdk1.6及之前:常量池分派在永世代 。
  • Jdk1.7:有,但已经慢慢“去永世代” 。
  • Jdk1.8及之后:无永世代,改用元空间取代(java.lang.OutOfMemoryError: PermGen space,这种错误将不会呈此刻JDK1.8中)。

3.2.3 Java栈(JVM Stack)

1) 栈是什么

Java栈是线程私有的,是在线程建设时建设,它的生命期是跟从线程的生命期,线程竣事栈内存也就开释,对付栈来说不存在垃圾接纳题目,只要线程一竣事该栈就Over,生命周期和线程同等。根基范例的变量和工具的引用变量都是在函数的栈内存平分派。

2) 栈存储什么

每个要领执行的时辰城市建设一个栈帧,栈帧中首要存储3类数据:

局部变量表:输入参数和输出参数以及要领内的变量;

栈操纵:记录出栈和入栈的操纵;

栈帧数据:包罗类文件、要领等等。

3) 栈运行道理

栈中的数据都是以栈帧的名目存在,栈帧是一个内存区块,是一个数据集,是一个有关要领和运行期数据的数据集。每一个要领被挪用直至执行完成的进程,就对应着一个栈帧在栈中从入栈到出栈的进程。

一文带你深入领略JVM

4) 当处所法栈(Native Method Stack)

当处所法栈和JVM栈施展的浸染很是相似,也是线程私有的,区别是JVM栈为JVM执行Java要领(也就是字节码)处事,而当处所法栈为JVM行使到的Native要领处事。它的详细做法是在当处所法栈中挂号native要领,在执行引擎执行时加载Native Liberies.有的假造机(好比Sun Hotpot)直接把两者合二为一。

5) 措施计数器(Program Counter Register)

措施计数器是一块很是小的内存空间,险些可以忽略不计,每个线程都有一个措施计较器,是线程私有的,可以看作是当前列程所执行的字节码的行号指示器,指向要领区中的要领字节码(下一个将要执行的指令代码),由执行引擎读取下一条指令。

6) 运行时常量池

运行时常量池是要领区的一部门,用于存放编译器天生的各类字面量和标记引用,这部门内容将在类加载后存放到要领区的运行时常量池中。相较于Class文件常量池,运行时常量池更具动态性,在运行时代也可以将新的变量放入常量池中,而不是必然要在编译时确定的常量才气放入。最首要的运用即是String类的intern()要领。

一文带你深入领略JVM

3.3 执行引擎(Execution Engine)

执行引擎执行包在装载类的要领中的指令,也就是要领。执行引擎以指令为单元读取Java字节码。它就像一个CPU一样,一条一条地执行呆板指令。每个字节码指令都由一个1字节的操纵码和附加的操纵数构成。执行引擎取得一个操纵码,然后按照操纵数来执利用命,完成后就继承执行下一条操纵码。

不外Java字节码是用一种人类可以读懂的说话编写的,而不是用呆板可以直接执行的说话。因此,执行引擎必需把字节码转换成可以直接被JVM执行的说话。字节码可以通过以下两种方法转换成吻合的说话:

  • 表明器: 一条一条地读取,表明并执行字节码执行,以是它可以很快地表明字节码,可是执行起来会较量慢。这是表明执行说话的一个弱点。
  • 即时编译器:用来补充表明器的弱点,执行引擎起首凭证表明执行的方法来执行,然后在吻合的时辰,即时编译器把整段字节码编译成当地代码。然后,执行引擎就没有须要再去表明执行要领了,它可以直接通过当地代码去执行。执行当地代码比一条一条举办表明执行的速率快许多,编译后的代码可以执行的很快,由于当地代码是生涯在缓存里的。
一文带你深入领略JVM

3.4 垃圾网络(Garbage Collection, GC)

3.4.1 什么是垃圾网络

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读