看了第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
}
分享到:
相关推荐
深入java虚拟机笔记http://blog.csdn.net/yangzl2008/article/details/8074667
深入理解Java虚拟机笔记(带目录).docx
1. JVM调优 1.1 JVM调优总结(一)-一些概念 1.2 JVM调优总结(二)-一些概念 1.3 JVM调优总结(三)-基本...4.1 JVM内存管理:深入Java内存区域与OOM 4.2 JVM内存管理:深入垃圾收集器与内存分配策略 4.3 深入理解JVM
深入理解Java虚拟机学习笔记借鉴.pdf
深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc
Java虚拟机的基本结构图:Java虚拟机包含一个类装载器(class loader),可以从程序和API中装载class文件,其中API只有程序执行时需要的那
该文档是本人的学习笔记,尚未精修,后续会精修排版. 学习笔记:深入浅出 Java 虚拟机.docx
i、关于读了深入java虚拟机后,做的一些比价,因为个人觉得此书翻译的时候还是有很多的引文说话的方式,读起来不是很顺。所以自己就对一些一些知识点发表自己的看法。
自己看《深入理解Java虚拟机》(第二版)所做的一些笔记。因为个人水平有限,能够理解的也只有前面几章的内容,后面的内容觉得看了也不是很理解,就没有记在里面。希望能对大家有所帮助,也希望能和大家一起进步。
NULL 博文链接:https://zhanjia.iteye.com/blog/1842733
JVM深入理解Java虚拟机 - 学习笔记
包括jvm 的内存模型 对象的创建过程 垃圾回收算法 垃圾回收器 内存分配和回收策略
本书十三个章节,分别讲解了android系统基础知识,android系统的结构和核心框架,Java虚拟机和Dalvik虚拟机的知识,实现程序编译和调试,Dalvik的运作流程,DEX优化和安全管理,Android虚拟机生命周期的管理和内存...
Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成...
它能干什么,文章从作者得角度带大家深入Java虚拟机相关内容,希望对大家有帮助。这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构和算法是一个道理,工欲善其事,必先利其器。...
java虚拟机源码学习 Understanding the JVM 深入理解Java虚拟机第三版 (周志明)源码及学习笔记
深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)
NULL 博文链接:https://zhanjia.iteye.com/blog/1842242