当前位置:首页 > JVM,JAVA虚拟机,内存机制,线程
JVM的机制学习
大纲
代码编译为classSun jdk中的javacClassLoaderClient compiler执行classServer compiler方法区,堆,JVM方法栈,本地方法栈,PC寄存器堆上分配栈上分配TLAB分配CopyingMark-SweepMark-Compact内存回收分代回收新生代可用GCJava代码的执行装载class内存空间内存分配串行GC并行回收GC并行GC算法内存管理Minor GC触发机制串行Mark-Sweep-Compact及日志旧生代GC并行Compact并发Mark-SweepJDK实现GC参数内存状态分析G1Jconsole,jstat,jmap,MAT同步Full GC线程交互状态
JVM标准结构
类加载子系统内存空间方法区Java堆Java栈本地方法栈垃圾收集器指令计数器及其他隐含计数器执行引擎本地方法接口本地方法库
Java代码执行机制
源码编译机制
JVM规范中定义了class文件的格式,JDK在编译java源码时,使用了javac,javac编译的步骤:
1. 分析和输入到符号表(Parse And Enter)
Parse做的是词法和语法的分析。
词法分析:将代码字符串转变为token序列
语法分析:将根据语法由token序列生成抽象语法树
Enter将符号输入到符号表,通常包括确定类的超类和接口,添加默认构造器等。 2. 注解处理
3. 语义分析和生成class文件
通常生成class文件不知包括字节码,一般包括 结构信息,元数据,方法信息。
下面是一个例子:
Compiled from \
//类/继承的超类/实现的接口的声明信息 public class Foo extends java.lang.Object SourceFile: \
//class文件格式版本号,major version 50 表示jdk 6, 49 为jdk 5只有高版本能执行低版本的class文件
minor version: 0
major version: 50
//常量池,存放了所有的Field名称,方法名,方法签名,类型名,代码及class文件中的常量值
Constant pool:
const #1 = Method #7.#27; // java/lang/Object.\const #2 = Field #6.#28; // Foo.count:I
const #3 = class #29; // java/lang/Exception const #4 = String #30; // count overflow
const #5 = Method #3.#31; // java/lang/Exception.\ing;)V
const #6 = class #32; // Foo
const #7 = class #33; // java/lang/Object const #8 = Asciz MAX_COUNT; const #9 = Asciz I;
const #10 = Asciz ConstantValue; const #11 = int 1000;
const #12 = Asciz count; const #13 = Asciz
const #16 = Asciz LineNumberTable; const #17 = Asciz LocalVariableTable; const #18 = Asciz this; const #19 = Asciz LFoo;; const #20 = Asciz bar; const #21 = Asciz ()I;
const #22 = Asciz StackMapTable; const #23 = Asciz Exceptions; const #24 = Asciz
const #27 = NameAndType #13:#14;// \const #28 = NameAndType #12:#9;// count:I const #29 = Asciz java/lang/Exception; const #30 = Asciz count overflow;
const #31 = NameAndType #13:#34;// \const #32 = Asciz Foo;
const #33 = Asciz java/lang/Object; const #34 = Asciz (Ljava/lang/String;)V; {
//将符号输入到符号表时生成的默认构造器方法 public Foo(); Signature: ()V
LineNumberTable: line 1: 0
LocalVariableTable:
Start Length Slot Name Signature 0 5 0 this LFoo;
Code:
Stack=1, Locals=1, Args_size=1 0: aload_0
1: invokespecial #1; //Method java/lang/Object.\ 4: return
LineNumberTable: line 1: 0
LocalVariableTable:
Start Length Slot Name Signature 0 5 0 this LFoo;
//bar方法的元数据信息
public int bar() throws java.lang.Exception; Signature: ()I
//对应字节码的源码行号信息,可在编译的时候通过-g:none 去掉行号信息,行号信息对于查找问题而言至关重要,因此最好保留 LineNumberTable: line 5: 0 line 6: 15 line 7: 19 line 9: 29
//局部变量信息,如生成的class文件中无局部变量信息,则无法知道局部变量的名称,并且局部变量信息是和方法绑定的,接口是没有方法体的,所以ASM之类的在获取接口方法时,是拿不到方法中参数的信息的 LocalVariableTable:
Start Length Slot Name Signature 0 33 0 this LFoo;
Code:
Stack=3, Locals=1, Args_size=1 //对应方法的字节码
0: getstatic #2; //Field count:I 3: iconst_1 4: iadd
共分享92篇相关文档