JVM 探索之一:JVM 组成

目录

 JVM在计算机中所处的层面

 JDK,JRE,JVM

JVM 主要组成


    

        作为一个java开发程序员,心里头一直飘着一个问题--怎么启动一个java虚拟机?
答案不是简单的“运行 java xx.jar...的命令”,而是运行 java ... 命令时,计算机具体做了些什么
      经过一番探索,发现如果要掌握完整详细的答案,基本上都可以写一个基本的jvm了。所以退而求其次,探索一下一些表面的,能帮助我们精通应用并且能做一些优化的程度。
因此想探索一下 jvm,我将整个 jvm 探索过程分为几个步骤,由于是一个持续过程,所以,会持续更新。
      首先针对上面问题,很表面的答案就是,java命令会启动java虚拟机启动JVM时,会启动了一个进程,该进程会自动启动一个主线程,然后主线程去调用某个类的main方法。
这个进程可以在操作系统(以windows为例)任务管理器中看到,如图:
也可以用命令查看:   打开cmd, 输入 tasklist 命令就能列出所有进程,并且能看到进程id(pid)。
至于进程,线程,就不在这里解释了,可以找相关操作系统的书了解一下。
      当然,这是很表面的东西,其中还有jvm初始化怎么分配内存,如何启动初始化各个组件(只是个人叫法)等。
      带着这些疑惑,我们首先得知道jvm本身的构成才行,这也是这开头篇主要探索的内容。

  •  JVM在计算机中所处的层面

JVM 探索之一:JVM 组成_第1张图片 JVM在计算机中所处的层面

        JVM 是运行在操作系统之上的,帮助人们屏蔽了操作系统的底层,是一种更高 level 的平台,之前提到 JVM 都会挂钩上 java 语言,现在的话, JVM 已经可以做到跨语言平台了,因为真正跑在 JVM 上的是 .class 文件, 所以对其他语言来说,只要有相对应的编译器, 就能将各个语言编译成 .class 文件。所以现在有种说法是,JVM 已经与 JAVA 语言无关了。

  •  JDK,JRE,JVM

JVM 探索之一:JVM 组成_第2张图片 JDK, JRE 与 JVM 之间的关系

  • JVM 主要组成

JVM 是一种规范,现在已经有很多种实现,但是我们用的比较多的还是 hotspot.下面以hotspot为例展开探索。

JVM 探索之一:JVM 组成_第3张图片 JVM 主要组成

 

  •  .class 文件: java 源文件经过 javac 命令编译后生成的 字节码 文件。经类加载器子系统将其加载在 JVM 中。
  • 类加载器: 将 .class 文件加载到内存中, 其中会将常量,class对象等存放在在方法区。
  • 方法区:在1.7 版本以前叫做 PermGen(永久代), 1.8 版本后叫做 Metaspace 。常量,class 对象信息都是存放在 这个地方。
  • java栈:java 的执行栈,每个线程都有其一个独立的执行栈和 PC 寄存器。
  • PC 寄存器:记录线程的下一条执行的指令。
  • java 堆:大部分的对象都是存放在java堆中。java 栈通过对象引用指向 java堆 中的对象。
  • 执行引擎:就是程序的执行器,会对字节码进行解析,生成指令,从而操作 java栈,java 堆等。
  • JIT complier: 即时编译器,对于一些高频率执行的代码,会触发即时编译器进行编译解析,提高执行效率。
  • 垃圾回收系统:对于没有用的内存进行回收。
  • 本地方法栈:本地方法的执行栈。JVM 可以通过它来执行一些本地方法。

这一篇开头篇就暂时记到这,以上内容属个人理解,如果侵权请及时联系我。或有不同见解,欢迎一起讨论。

 

你可能感兴趣的:(jvm,java)