JVM内部是如何工作的?



JVM内部是如何工作的?

首先,编译下java源文件:

javac MyFirstJavaProgram.java

-----------------------------MyFirstJavaProgram.java-------------------------------------

public class MyFirstJavaProgram {

    public static void main(String []args) {
       System.out.println("Hello World");
    }
}

-----------------------------MyFirstJavaProgram.java-------------------------------------

然后,执行下:

java MyFirstJavaProgram

这个过程中,java这个程序去找MyFirstJavaProgram.class这个文件,这个文件是源文件编译后的字节码,怎样查看字节码?

输入javap -c MyFirstJavaProgram.class得到下面内容:

Compiled from "MyFirstJavaProgram.java"
public class MyFirstJavaProgram {
  public MyFirstJavaProgram();
    Code:
       0: aload_0      
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return       

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return       
}

找到这个字节码文件,把字节码扔给JVM(Java虚拟机),然后JVM解释成一系列计算机指令,最后输出结果。

JVM里面有各种堆、栈、寄存器、方法表和方法数据等,执行过程就是字节码对应JVM底层计算机指令的解析和执行过程(包含类加载器,执行引擎和运行数据区域等)。

参考资料:

1. https://www.quora.com/How-does-JVM-works-internall

2. https://www.artima.com/insidejvm/ed2/jvmP.html 

3. https://dzone.com/articles/understanding-jvm-internals

时间: 2024-09-19 17:39:17

JVM内部是如何工作的?的相关文章

JVM 内部运行线程介绍

感谢同事[觉梦]投递此稿. hi,all 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来进行分析.  stack 里面线程非常多,排查起来需要一定的经验,所以,对它们有一定了解,可以提高排查问题的效率.  现在网上资料也不是特别全,所以,导致很多新人在拿到一个stack文件之后,也不知知道从何看起. 下面我把这次整理的一些个人认为比较常见的线程列出来. 线程

JVM内部原理

JVM内部原理 原文链接 原文作者:James D Bloom 翻译:梅小西(904516706)  校对:吴京润   这篇文章详细描述了Java虚拟机的内在结构.下面这张图来自<The Java Virtual Machine Specification Java SE 7 Edition>,它展示了一个典型的JVM的主要的内部结构. 接下来的2个部分,将详细介绍这幅图中所有组成结构. 第一部分涵盖了每个线程都会生成的结构, 第二部分 涵盖了单独的每个线程生成的结构. 线程 JVM 系统线程

jvm内部现成运行

hi,all 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来进行分析.  stack 里面线程非常多,排查起来需要一定的经验,所以,对它们有一定了解,可以提高排查问题的效率.  现在网上资料也不是特别全,所以,导致很多新人在拿到一个stack文件之后,也不知知道从何看起. 下面我把这次整理的一些个人认为比较常见的线程列出来. 线程 所属 说明 Attach

一篇笔记整理JVM工作原理

首先要了解的 >>数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值. "引用值"代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置. 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress 引用类型包括:类类型,接口类型和数组. >>堆与栈 栈是运行时的

深入了解JVM-----Inside JVM读书笔记

笔记   本文首先介绍一下Java虚拟机的生存周期,然后大致介绍JVM的体系结构,最后对体系结构中的各个部分进行详细介绍. (  首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实例对应了一个独立运行的java程序,而JVM执行引擎实例则对应了属于用户运行程序的线程:也就是JVM实例是进程级别,而执行引擎是线程级别的.) 一. JVM的生命周期 JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String

关于JVM命令行标志您不知道的5件事:调优JVM性能和Java运行时

JVM 是多数开发人员视为理所当然的 Java 功能和性能背后的重负荷机器.然而,我们很少有人能理解 JVM 是如何进行工作的 - 像任务分配和垃圾收集.转动线程.打开和关闭文件.中断和/或 JIT 编译 Java 字节码,等等. 不熟悉 JVM 将不仅会影响应用程序性能,而且当 JVM 出问题时,尝试修复也会很困难. 本期 5 件事 系列 将介绍一些命令行标志,您可以使用它们来诊断和调优您的 Java 虚拟机性能. 1. DisableExplicitGC 我已记不清有多少次用户要求我就应用程

深入浅出JVM

原文地址:http://blog.jamesdbloom.com/JVMInternals.html(转载请注明英文原文出处以及本文地址) 这篇文章简要解析了JVM的内部结构.下面这幅图展示了一个典型的JVM(符合JVM Specification Java SE 7 Edition)所具备的关键内部组件. 上图展示的所有这些组件都将在下面两个章节中被解析.第一章包含将会在每个线程上创建的组件:第二章包含那些不依赖于线程即可创建的组件(线程间可共享的组件). 线程内创建 JVM系统线程 单个线程

JVM实用参数(六) 吞吐量收集器

原文链接 本文连接 译者:张军  校对:梁海舰 在实践中我们发现对于大多数的应用领域,评估一个垃圾收集(GC)算法如何根据如下两个标准: 吞吐量越高算法越好 暂停时间越短算法越好 首先让我们来明确垃圾收集(GC)中的两个术语:吞吐量(throughput)和暂停时间(pause times). JVM在专门的线程(GC threads)中执行GC. 只要GC线程是活动的,它们将与应用程序线程(application threads)争用当前可用CPU的时钟周期. 简单点来说,吞吐量是指应用程序线

学习JVM虚拟机有什么实践意义?

问题描述 学习JVM虚拟机有什么实践意义? 最近,有朋友问我你会JVM虚拟机类加载么,我的回答是,大概了解.具体内容,没办法具体讲出来?请问大家觉得需要把JVM虚拟机的原理与实现线路图弄的很明白么.有什么实践意义?毕竟,不是在做博士论文.这里关于JVM有几个知识点,大家给点意见: 1.垃圾回收算法与原理 2.类字节码规范与执行引擎 3.内存模型与线程 4.类加载机制 5.编译器 解决方案 只有学了程序背后的东西才能成为CTO 解决方案二: 如果简单开发没必要,但如果要做深,那多了解了解还是很有必