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

对JVM尚有什么不懂的?带你深入浅出JVM!

发布时间:2019-10-12 07:18:08 所属栏目:站长百科 来源:java互联网架构
导读:JVM JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据地区(runtime data area) 下面这幅图展示了一个典范的JVM(切合JVM Specification Java SE 7 Edition)所具备的要害内部组件。 组件中的多线程处理赏罚 多线程处理赏罚或自由线程处理赏罚指的

实例化 类或接口,包括执行类或接口的实例化要领:

对JVM尚有什么不懂的?资深架构师一篇文章带你深入浅出JVM!

在JVM中存在多个差异职责的类加载器。每一个类加载器都署理其已被加载的父加载器(除了bootstrap类加载器,由于它是根加载器)。

Bootstrap类加载器:当java措施运行时,java假造机必要装载java类,这个进程必要一个类装载器来完成。而类装载器自己也是一个java类,这就呈现了相同人类的第一位母亲是怎样发生出来的题目。

着实,java假造机中内嵌了一个称为Bootstrap的类装载器,它是用特定于操纵体系的当地代码实现的,属于java假造机的内核,这个Bootstrap类装载器不消专门的类装载器去装载。Bootstrap类装载器认真加载java焦点包中的类。

Extension 类加载器:从尺度的Java扩展API中加载类。譬喻,安详的扩展成果集。

System 类加载器:这是应用措施默认的类加载器。它从classpath中加载应用措施类。

用户界说的类加载器:可以特殊得界说类加载器来加载应用措施类。用户界说的类加载器可用于一些非凡的场景,好比:在运行时从头加载类或将一些非凡的类断绝为多个差异的分组(凡是web处事器中城市有这样的需求,好比Tomcat)。

更快的类加载

一个称之为类数据共享(CDS)的特征自HotspotJVM 5.0开始被引进。在安装JVM时代,安装器加载一系列的Java焦点类(如rt.jar)到一个颠末映射过的内存区举办共享存档。CDS镌汰了加载这些类的时刻从而晋升了JVM的启动速率,同时应承这些类在差异的JVM实例之间共享。这大大镌汰了内存碎片。

要领区的位置

JVM Specification Java SE 7 Edition清晰地声明:尽量要领区是堆的一个逻辑构成部门,但最简朴的实现也许是既差池它举办垃圾接纳也不压缩它。然而抵牾的是操作jconsole查察Oracle的JVM的要领区(以及CodeCache)长短堆情势的。OpenJDK代码表现CodeCache相对ObjectHeap而言是VM中一个独立的域。

类加载器引用

类凡是是按需加载,即第一次行使该类时才加载。因为有了类加载器,Java运行时体系不必要知道文件与文件体系。

运行时常量池

JVM对每个范例维护着一个常量池,它是一个跟标记表相似的运行时数据布局,但它包括了更多的数据。Java的字节码必要一些数据,凡是这些数据会由于太大而难以直接存储在字节码中。取而代之的一种做法是将其存储在常量池中,字节码包括一个对常量池的引用。运行时常量池首要用来进动作态链接。

几种范例的数据会存储在常量池中,它们是:

  • 数值字面量
  • 字符串字面量
  • 类的引用
  • 字段的引用
  • 要领的引用

假如你编译下面的这个简朴的类:

  1. package org.jvminternals;public class SimpleClass { public void sayHello() {System.out.println("Hello");}} 

天生的类文件的常量池,看起来会像下图所示:

  1. Constant 
  2.  pool: #1 = Methodref #6.#17 // java/lang/Object."<init>":()V#2 =  
  3. Fieldref #18.#19 // java/lang/System.out:Ljava/io/PrintStream;#3 =  
  4. String #20 // "Hello"#4 = Methodref #21.#22 //  
  5. java/io/PrintStream.println:(Ljava/lang/String;)V#5 = Class #23 //  
  6. org/jvminternals/SimpleClass#6 = Class #24 // java/lang/Object#7 = Utf8  
  7. <init> #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 
  8.  = Utf8 LocalVariableTable #12 = Utf8 this #13 = Utf8  
  9. Lorg/jvminternals/SimpleClass; #14 = Utf8 sayHello #15 = Utf8 SourceFile 
  10.  #16 = Utf8 SimpleClass.java #17 = NameAndType #7:#8 //  
  11. "<init>":()V#18 = Class #25 // java/lang/System#19 = NameAndType  
  12. #26:#27 // out:Ljava/io/PrintStream;#20 = Utf8 Hello #21 = Class #28 //  
  13. java/io/PrintStream#22 = NameAndType #29:#30 //  
  14. println:(Ljava/lang/String;)V#23 = Utf8 org/jvminternals/SimpleClass #24 
  15.  = Utf8 java/lang/Object#25 = Utf8 java/lang/System #26 = Utf8 out#27 =  
  16. Utf8 Ljava/io/PrintStream; #28 = Utf8 java/io/PrintStream #29 = Utf8  
  17. println #30 = Utf8 (Ljava/lang/String;)V 

(编辑:湖南网)

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

热点阅读