JVM一些基本知识

来源:互联网 发布:甲文:君子之学也,入乎 编辑:程序博客网 时间:2024/06/07 18:16
1. JAVA代码的执行机制
1.1 JAVA源码编译机制
三个步骤:分析和输入到符号表,注解处理,语义分析 和生成class文件
->class文件:
结构信息:版本号,各部分的数量和大小
元数据:对应源文件中的“声明”和“常量”
方法信息:对应源文件中的“语句”和“表达式”

1.2 类加载机制
三个步骤:装载,链接和初始化
1)装载
通过全限定名类加载器进行加载,也通过这两个元素来标志一个被加载的类。对数组类型的类,其名称为“[”+(基本类型名或L+引用类型名)
2) 链接
校验二进制字节码的格式,初始化装载类中的静态变量,解析类中调用的接口和类。
3) 初始化
执行类中的静态初始化代码、构造代码及静态属性初始化

类的加载通过Classloader及其子类来完成,分为Bootstrap Classloader, Extension ClassLoader, SystemClassLoader和User-Defined ClassLoader。
Bootstrap Classloader:装载 $JAVA_HOME/jre/lib/rt.jar
Extension ClassLoader:装载 $JAVA_HOME/jre/lib/ext/*.jar
SystemClassLoader:装载$Classpath中的类
User-Defined ClassLoader:用户自定义,加载非Classpath中的类,或者对类进行一些动作如解密

1.3 执行机制
1) 解释执行
JVM采用了invokestatic,  invokevirtual, invokeinterface, invokespecial来执行不同的方法调用。
线程在创建后会产生程序计数器和栈,栈中存放栈帧,每个方法调用都会产生栈帧。栈帧主要分为局部变量区和操作数栈。
Sun JDK主要采用token-threading方式,优化方式:栈内缓存和部分栈共享
2) 编译执行
解释执行的效率低,为了提高代码的执行效率,Sun JDK提供将字节码 编译成机器码的支持。编译在执行时运行,编译器叫做JIT(Just In Time)编译器。
Sun JDK提供两种模式:client compiler和 server compiler。
client compiler 又称为C19,较为轻量。只做性能开销比高的优化,主要有:方法内敛、去虚拟化、荣誉消除。
server compiler 又称为C213,较为重量。逃逸分析是C2进行很多优化的基础。优化方法有:标量替换,栈上分配、同步消除 
3) 反射执行
Class actionClass = Class.forName(外部实现类);
Method method = testClass.getMethod("execute",null);
Object action = acrtionClass.newInstance();
method.invoke(action,null);

2. JVM内存管理
2.1 JVM内存模型
Sun JDK按照JVM规范将内存空间氛围:方法区、堆、本地方法栈、PC寄存器及JVM方法栈。
方法区存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息,对应Permanent Generation。
用于存储对象实例和数组值,可以认为所有通过new创建的对象的内存都在堆中分配。堆被划分为New Generation和Old Generation。
Sun JDK中本地方法栈和JVM方法栈是同一个。
每个线程均会创建PC寄存器和JVM方法栈。PC寄存器占用的可能为CPU寄存器或OS内存,JVM方法栈占用的是OS内存。

JVM内存模型:


2.2 JVM内存回收
收集器:引用计数收集器、跟踪收集器。
引用计数收集器对循环引用无法处理,所以Sun JDK未采用这种方式。
跟踪收集器采用集中式管理,全局记录数据的应用状态,基于一定条件触发,从根集合扫描对象的引用关系,会造成应用程序暂停,主要有:Copying、Mark-Sweep、Mark-Compact三种算法。
GC有两种类型:Minor GC,对新生代进行GC;Full GC,对新生代、老年代和持久代都进行GC。

JAVA中除了强应用外还有Strong Reference外还有Soft Reference、Weak Reference和Phantom Reference。

Soft Reference的作用是告诉垃圾回收器,程序中的哪些对象是不那么重要,当内存不足的时候是可以被暂时回收的。当JVM中的内存不足的时候,垃圾回收器会释放那 些只被软引用所指向的对象。
Weak Reference的作用是引用一个对象,但是并不阻止该对象被回收。如果使用一个强引用的话,只要该引用存在,那么被引用的对象是不能被回收的。弱引用则没有这个问题。在垃圾回收器运行的时候,如果一个对象的所有引用都是弱引用的话,该对象会被回收。
在使用Phantom Reference的时候必须要指定一个引用队列。当一个对象的finalize方法已经被调用了之后,这个对象的幽灵引用会被加入到队列中。通过检查该队列里面的内容就知道一个对象是不是已经准备要被回收了。

原创粉丝点击