Java自动内存管理机制(一) JVM、Class

关于JVM的内存回收机制,内容概念非常多,非一篇博文所能详尽。所以这里只截取重要部分。详细之处可参阅相关书籍或博客:
《深入理解Java虚拟机-JVM高级特性与最佳实践》 周志明 著

1.JVM概念

Java Virtrual Machine(JVM)

JRE的一部分,一个操作系统的一个应用程序一个进程,有自己的运行的生命周期,也有自己的代码和数据空间

主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用

Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。

主要内容

2个重点
1. Java代码编译和执行流程
2. JVM内存管理及垃圾回收机制

2. Java代码编译与执行

流程框架
Java自动内存管理机制(一) JVM、Class_第1张图片
关于Java编译执行过程,下面这篇博客已经介绍非常详细:
http://blog.csdn.net/cutesource/article/details/5904542

  • Java源码编译机制
  • 类加载机制
  • 类执行机制

Java源码编译机制

源文件(.java)–>1.分析和输入符号表–>2.注解处理–>3.语义分析和生成class文件

关于class文件的结构:

  • 结构信息:包括魔数及版本信息
  • 元数据:包库常量池计数器和常量池数据区
  • 方法信息:Java源码中语句和表达式对应的信息。

详见博客
http://blog.csdn.net/luanlouis/article/details/39892027

类加载机制

类加载过程

1.生命周期

从被加载到虚拟机内存,到卸载内存为止,包含7个阶段:加载 、验证、解析、 准备、初始化、使用、卸载。验证、准备和解析统称为连接。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,而解析则不一定,它可以在初始化阶段之后再开始,以支持java的运行时绑定。

初始化:遇到new(实例化对象)、getstatic(读取类静态字段)、putstatic(设置类静态字段)、invokestatic(调用类静态方法)这4条字节码指令;使用Java.lang.reflect包对类进行反射调用;当初始化一个类时,如果父类没有初始化,则对父类初始化。以三种情况必须对类初始化

2.类加载过程

还是那七个过程,只不过需要详细解释:
http://blog.csdn.net/a19881029/article/details/17068191

3.双亲委派模型

http://www.cnblogs.com/lanxuezaipiao/p/4138511.html

Java自动内存管理机制(一) JVM、Class_第2张图片
如果一个类加载器收到了类加载的请求,首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

类加载器

JVM的类加载是通过ClassLoader及其子类来完成;

保证此类所有ClassLoader只加载一次;
Java自动内存管理机制(一) JVM、Class_第3张图片
启动类加载器(Bootstrap ClassLoader):负责将存放在JAVA_HOME\lib目录中的,或被-Xbootclasspath参数所指定的路径中的,且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被Java程序直接使用。
扩展类加载器(Extension ClassLoader):由sun.misc.Launcher$ExtClassLoader实现负责加载JAVA_HOME\lib\ext目录中的,或者被Java.ext.dirs系统变量所指定路径中的所有类库;
应用程序类加载器(Application ClassLoader):由sun.misc.Launcher$AppClassLoader实现负责加载用户类路径上(ClassPath)所指定的类库;一般作为默认的类加载器

  1. 运行一个程序时,总是由AppClass Loader(系统类加载器)开始加载指定的类。
  2. 在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。
  3. Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.

类执行机制

基于栈的体系结构来执行class字节码的
线程创建后,都会产生程序计数器(PC)和栈(Stack)
程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧
每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成。局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。

你可能感兴趣的:(Java)