`
wangdei
  • 浏览: 379369 次
社区版块
存档分类
最新评论

《深入JAVA虚拟机》笔记(一)

阅读更多
看了第6章的java class文件这一部分,我觉得对class文件有进一步的了解。于是想作一点笔记,以备以后查时方便。
      这章的一个例子虽然简单,但是我觉的很有一定代表性。例子如下:

1:class Act {
2:   public static void doMathForever(int m) {
3:      int i = 0;
4:     int n=4>3?1:0;
5:        for (;;) {
6:           i += 1;
7:            i *= 2;
8:       }
9:    }
10:}


我用javap -verbose Act查看,代码如下:(红色为自己加上的注解)
Compiled from "Act.java"    
因为编译原文件不一定必须与java语言相关,可以使用其他语言来编写程序,然后将其编译为class文件,所以这里要写上Act.java而不是Act. 呵呵,想来以前为什么javac 来编译源文件时一定要加.java,而java 执行时就不需要加.java了,当时就是搞不懂,现在明白了。
class Act extends java.lang.Object
  SourceFile: "Act.java"
SourceFile属性,它提供了产生class文件的源文件的名称,它是一个可选的项,为什么说它是可选项的,因为class可以自己用UE等工具写。
  minor version: 0
  major version: 49
版本号:我用的是5.0的,出来的major version 是49,书上说1.0或1.2是45,1.4我想可能是48 吧。呵呵,还没有试过。
  Constant pool:
这个是常量池,刚看书的时候我还以为常量池放的一定是常量。错。
常量池就是该类型所用常量的一个有序集合,包括直接常量(String,integer,floating  point常量)和对其他类型、字段和方法的符号引用。
const #1 = Method #3.#12; //  java/lang/Object."<init>":()V
因为Constant pool#0是不用的,所以只能从#1开始,但不知为什么第一个是Method而不是class,我现在还不明白。
const #2 = class #13; //  Act
CONSTANT_Class是对一个类或接口的符号引用。这个是指向#13
const #3 = class #14; //  java/lang/Object
const #4 = Asciz <init>;
这个Asciz应该表示是CONSTANT_Utf8吧,因为C ONSTANT_Utf8可以是存储四种基本信息类型:文字字符串、被定义的类和接口描述、对其他类或接口的符号引用以及属性相关的字符串。
<init>是实例的初始化方法,是实例调用方法前必须要<init>的,
<clinit>是类的初始化方法。
const #5 = Asciz ()V;
此<init>的描述符,()V表示<init>没有带参数,返回的是void型的。
书上介绍:
()I  int getSize() 
() Ljava/lang/String      String toString()
const #6 = Asciz Code;
Code在所有不是抽象或者本地方法的method_info信息中,都存在一个Code_attribute表。
但是我试一下在抽象的方法中同样也有code的啊,不懂中。
const #7 = Asciz LineNumberTable;
LineNumberTable属性建立了方法字节码流偏移量和源代码行号之间的映射关系。关于这一点,我在下面详细谈到。
const #8 = Asciz doMathForever;
const #9 = Asciz (I)V;
const #10 = Asciz SourceFile;
const #11 = Asciz Act.java;
const #12 = NameAndType #4:#5;//  "<init>":()V
NameAndType指向字段或者方法的符号引用的一部分。为什么没有指向#8,#9呢?不懂中。
const #13 = Asciz Act;
const #14 = Asciz java/lang/Object;
{
Act();
  Code:
   Stack=1, Locals=1, Args_size=1
需要的栈为1个,只是this的存取;本地变量为1个,也是this,方法的参数是1个,也是this传入。
   0: aload_0
从局部变量0中装载引用类型。
   1: invokespecial #1; //Method java/lang/Object."<init>":()V
调用Object的<init>方法,因为每个类都是继承Object,所以实例时都要调用Object的<init>方法。
   4: return
  LineNumberTable:
   line 1: 0

public static void doMathForever(int);
  Code:
   Stack=2, Locals=3, Args_size=1
   0: iconst_0 将i 压入栈
   1: istore_1 放i
   2: iconst_1 同上
   3: istore_2
   4: iinc 1, 1  i++
  7   iload_1 从局部变量1中装载int类型值。
   8: iconst_2
   9: imul
   10: istore_1
   11: goto 4
  LineNumberTable:
   line 3: 0  源代码第3行对应Code中的0偏移量。
   line 4: 2
   line 6: 4
   line 7: 7
   line 8: 11

}

1
0
分享到:
评论
2 楼 wangdei 2008-01-08  
呵呵.是的.
1 楼 RednaxelaFX 2008-01-07  
您好。请问这篇是迁移到JavaEye而转过来的文章吗?之前在您的另外一个blog读到过这篇,貌似是前年的事情。不过转过来的时候似乎格式信息损失了,原本红色的标记没了。[ code ]和[ color ]标签应该能解决这样的问题吧。

相关推荐

    深入java虚拟机笔记

    ### 深入Java虚拟机知识点总结 #### 第一章 Java体系结构介绍 - **Java体系结构概述**:本章主要介绍了Java体系结构的基本概念及其组成部分。Java体系结构旨在为开发者提供一个统一、高效且跨平台的应用开发环境。...

    深入理解Java虚拟机笔记(带目录).docx

    深入理解 Java 虚拟机笔记 Java 虚拟机(JVM)是 Java 语言的运行环境,它负责解释和执行 Java 字节码。下面是 Java 虚拟机相关的知识点: 虚拟机内存结构 Java 虚拟机的内存结构主要包括以下几个部分: * 方法...

    深入理解Java虚拟机学习笔记借鉴.pdf

    Java 虚拟机(JVM)自动内存管理机制是 Java 语言的一大特色,它使得 Java 程序员无需手动管理内存,从而提高了开发效率和程序稳定性。JVM 自动内存管理机制主要通过 JVM 的内存模型来实现,它将 JVM 的内存在运行时...

    深入Java虚拟机读书笔记1

    深入理解Java虚拟机,首先我们要明白Java虚拟机(JVM)的核心功能:它负责装载类文件,执行字节码,并管理内存。Java虚拟机的结构复杂且高效,主要由类装载器、执行引擎、内存管理和类库等组件构成。 类装载器是JVM...

    深入理解Java虚拟机读书笔记之:第3章 安全(3)

    《深入理解Java虚拟机》是Java开发者必读的经典之作,其中第三章主要探讨了Java安全方面的内容。在Java中,安全是一个至关重要的概念,因为Java的设计目标之一就是提供一种可以在不同环境中安全运行的代码机制。本章...

    深入java虚拟机读后笔记

    ### 深入理解Java虚拟机(JVM)的关键知识点 #### 一、Java与Java虚拟机的关系 Java语言的设计者们为了使Java程序能够跨平台运行,引入了一个概念——Java虚拟机(JVM)。简单来说,Java源代码在编译成`.class`...

    学习深入理解Java虚拟机的前几章笔记

    ### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...

    学习笔记:深入浅出 Java 虚拟机.docx

    Java 虚拟机(JVM)是Java编程语言的核心组成部分,它允许Java代码在不同的操作系统上运行,实现了“一次编写,到处运行”的目标。JVM 是一个虚拟计算机,能够执行字节码(.class文件),这些字节码是Java源代码经过...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

    读书笔记:java 虚拟机,深入理解Java虚拟机 JVM高级特性与最佳实践 .zip

    读书笔记:java 虚拟机,深入理解Java虚拟机 JVM高级特性与最佳实践

    读书笔记:学习周志明先生的深入理解Java虚拟机的笔记.zip

    读书笔记:学习周志明先生的深入理解Java虚拟机的笔记

    深入理解Java虚拟机.xmind

    自己看《深入理解Java虚拟机》(第二版)所做的一些笔记。因为个人水平有限,能够理解的也只有前面几章的内容,后面的内容觉得看了也不是很理解,就没有记在里面。希望能对大家有所帮助,也希望能和大家一起进步。

    虚拟机学习笔记--周志明老师第三版

    虚拟机学习笔记 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,负责加载、验证、执行 Java 字节码。以下是 JVM 相关知识点的总结。 1. 运行时数据区域 JVM 的运行时数据区域主要包括: * 堆(Heap):...

    读书笔记:周志明的《深入理解java虚拟机》读书笔记.zip

    读书笔记:周志明的《深入理解java虚拟机》读书笔记

    尚硅谷JAVA基础笔记吐血整理

    它的设计目标是实现“一次编写,到处运行”,通过Java虚拟机(JVM)确保代码在不同操作系统上都能运行。Java语言的特点包括简洁性、面向对象、健壮性、安全性、高效性和可移植性。 【基本语法】 Java的基本语法包括...

    读书笔记:深入理解Java虚拟机周志明.zip

    读书笔记:深入理解Java虚拟机周志明

    深入理解Java虚拟机读书笔记之:第3章 安全(2)

    总的来说,"深入理解Java虚拟机读书笔记之:第3章 安全(2)"主要涵盖了Java安全体系的核心概念,包括类加载器、权限模型、安全管理器以及相关工具的使用。理解这些内容对于任何希望构建安全、可靠的Java应用程序的...

    Java虚拟机讲解笔记.docx

    #### 一、Java虚拟机概述与基本概念 Java虚拟机(JVM)是运行Java字节码的虚拟环境,它位于操作系统之上,硬件之下,提供了一层软件抽象,使得Java程序可以在多种平台上运行而无需重新编译。JVM的核心功能包括内存...

    读书笔记:深入理解Java虚拟机周志明著.zip

    读书笔记:深入理解Java虚拟机周志明著

Global site tag (gtag.js) - Google Analytics