`
chenjingbo
  • 浏览: 460583 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入Java虚拟机- 随笔1

 
阅读更多

      最近在看 深入Java虚拟机.基本算是浏览式阅读,不过想着总应该记一点,所以特意开了这么一篇内容.下面的所有内容,都是个人觉得书中有意思的东西,算是一个随笔.既然是随笔,那么就不会如记笔记那般对每一章的内容进行归纳概括(其实我个人也觉得没有必要对书中的每一章进行记录),算是一个个小的知识点的Mark.还有很多是个人的理解(或者引用其他的知识解释),并不是原文的copy 废话到此为止.

 

.第五章 Java虚拟机



 

1 方法区

 

public class Foo {

    public static void main(String[] args){
        Bar bar = new Bar();
        bar.bar();
    }
}
class Bar {
    void bar(){
        
    }
}

 

对应的javap 输出放出来,后面会用到.

写道
Compiled from "Foo.java"
public class Foo extends java.lang.Object
SourceFile: "Foo.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #6.#15; // java/lang/Object."<in
const #2 = class #16; // Bar
const #3 = Method #2.#15; // Bar."<init>":()V
const #4 = Method #2.#17; // Bar.bar:()V
const #5 = class #18; // Foo
const #6 = class #19; // java/lang/Object
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz main;
const #12 = Asciz ([Ljava/lang/String;)V;
const #13 = Asciz SourceFile;
const #14 = Asciz Foo.java;
const #15 = NameAndType #7:#8;// "<init>":()V
const #16 = Asciz Bar;
const #17 = NameAndType #20:#8;// bar:()V
const #18 = Asciz Foo;
const #19 = Asciz java/lang/Object;
const #20 = Asciz bar;

{
public Foo();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<i
4: return
LineNumberTable:
line 1: 0


public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: new #2; //class Bar
3: dup
4: invokespecial #3; //Method Bar."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4; //Method Bar.bar:()V
12: return
LineNumberTable:
line 4: 0
line 5: 8
line 6: 12


}

 

 

下面会描述虚拟机(hotspot)是如何执行Foo.main方法中的第一条指令的(也就是new操作符)

首先,虚拟机被告知需要执行Foo类中的方法,那么,会自动查找并读入"Foo.class"的字节码,存放在方法区中,然后执行方法区中,Foo.class对应的main方法字节码,在整个执行过程中,虚拟机会一直持有Foo类的常量池的指针,

现在虚拟机开始执行第一条指令,也就是new指令.,可以看一下new指令的描述

写道
new

Operation

Create new object

Format


new
indexbyte1
indexbyte2
Forms

new = 187 (0xbb)

Operand Stack

... →

..., objectref

Description

The unsigned indexbyte1 and indexbyte2 are used to construct an index into the run-time constant pool of the current class (§2.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The run-time constant pool item at the index must be a symbolic reference to a class or interface type. The named class or interface type is resolved (§5.4.3.1) and should result in a class type. Memory for a new instance of that class is allocated from the garbage-collected heap, and the instance variables of the new object are initialized to their default initial values (§2.3, §2.4). The objectref, a reference to the instance, is pushed onto the operand stack.

On successful resolution of the class, it is initialized (§5.5) if it has not already been initialized.

Linking Exceptions

During resolution of the symbolic reference to the class, array, or interface type, any of the exceptions documented in §5.4.3.1 can be thrown.

Otherwise, if the symbolic reference to the class, array, or interface type resolves to an interface or is an abstract class, new throws an InstantiationError.

Run-time Exception

Otherwise, if execution of this new instruction causes initialization of the referenced class, new may throw an Error as detailed in JLS §15.9.4.

Notes

The new instruction does not completely create a new instance; instance creation is not completed until an instance initialization method (§2.9) has been invoked on the uninitialized instance.

 重点看加粗的说明.我用中文表达一下new指令会做的工作:虚拟机通过计算( (indexbyte1 << 8) | indexbyte2)生成一个指向常量池的索引,然后根据这个索引找到常量池的索引.就是javap输出中的

写道
const #2 = class #16; // Bar

 

该索引必须是CONSTANT_Class_info类型.这时候,可以获取到对应Bar的全额限定名,也就是Bar.虚拟机会检查Bar类是否被加载,这时发现未被装载(多数jvm实现都是通过懒加载来做类的加载的),它就查找并加载Bar类.并放入到方法区中.紧接着,虚拟机会以一个指向方法区Bar类的直接引用替换常量池中Bar的字符引用了(这就是常量池解析)终于.虚拟机为这个对象在堆中创建实例,最后将堆中的实例的实例压入栈顶.至于中间如何计算对象大小,还有如何初始化Bar类,就不在这里多数啦..

 

 

 

  • 大小: 34.7 KB
分享到:
评论

相关推荐

    深入Java虚拟机-周志明

    这是对学习Java虚拟机的很好的入门书。虚拟机的书很少,除了规范之外,就很少见了。

    深入java虚拟机-曹晓钢版

    最早的一个研究jvm的书籍,曹晓钢的版本。可以对照周志明的一起研究!

    深入java虚拟机.pdf

    深入 Java 虚拟机.pdf Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序执行的核心组件。它提供了一个平台无关的环境,允许 Java 程序在不同的操作系统和硬件平台上运行。 一...

    深入java虚拟机 中文版 pdf

    《深入Java虚拟机》这本书是IT领域中关于Java虚拟机(JVM)的深度解析之作,主要聚焦于JVM的工作原理、内部结构以及优化技巧。Java虚拟机作为Java语言的核心组件,其性能直接影响到Java应用程序的运行效率。因此,对...

    深入理解Java虚拟机--类加载及执行子系统的案例与实战xmind文件

    深入理解Java虚拟机--类加载及执行子系统的案例与实战xmind文件

    深入理解 Java 虚拟机 - v1.0.pdf

    虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种...Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

    深入java虚拟机-第二版.rar

    《深入Java虚拟机》第二版是一本深受Java开发者喜爱的经典著作,它详尽地解析了Java虚拟机(JVM)的工作原理,涵盖了JVM的重要概念、设计与实现,以及优化策略。这本书对于理解Java程序的运行机制、提升性能调优能力...

    揭秘Java虚拟机-JVM设计原理与实现

    《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...

    22 深入拆解 Java 虚拟机-20200406T052847Z-001.zip

    Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了跨平台的运行环境。深入理解JVM的工作原理对于优化Java程序性能、排查问题以及提升开发能力至关重要。以下将详细介绍JVM的主要组成部分、内存模型、...

    深入Java虚拟机--2积分

    本书详细地介绍了java体系结构极其内部细节,了解这些内容才能更快速的编写高效的程序

    深入java虚拟机第二版

    java虚拟机不用多少了吧。 深入java虚拟机第二版.pdf

    Java虚拟机----类的加载过程.docx

    Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...

    深入JAVA虚拟机 随书源码 JVM规范

    首先,我们来看《深入JAVA虚拟机》这本书,它涵盖了JVM的各个关键方面,包括指令集、运行时数据区、方法区、堆内存、栈帧结构、编译与优化、异常处理和安全性等。书中通过实例解析,帮助读者理解JVM如何处理Java程序...

    深入理解Java虚拟机-文前1

    本书《深入理解Java虚拟机:JVM高级特性与最佳实践》将带领读者深入到JVM的内部世界,全面地理解其各个组成部分的工作机制。全书分为五个部分,每个部分都深入浅出地介绍了JVM的不同方面。 在第一部分中,作者回顾...

    深入Java虚拟机——本地方法栈.pdf

    Java虚拟机(JVM)是Java程序运行的基础,它提供了执行环境和各种内存区域,以支持Java代码的高效运行。本地方法栈是JVM的一部分,它主要负责处理与本地方法(通常是由C或C++编写)相关的调用。本地方法栈在Java线程...

    深入Java虚拟机.xmind

    深入Java虚拟机-思维导图,算是对深入Java虚拟机专栏的总结和梳理。

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字)

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字) Java序列化和反序列化是Java虚拟机中的一种重要机制,它们可以将Java对象转换为二进制数据,然后...

    深入JAVA虚拟机.pdf

    深入JAVA虚拟机,帮助大家在Java方面进行学习,深入JAVA虚拟机,帮助大家在Java方面进行学习,

Global site tag (gtag.js) - Google Analytics