1. JVM体系结构

2. 类加载器

  • bootstrap class loader(引导类加载器):是其他类加载器的父类,它用于加载Java核心库,并且是唯一一个用本地代码编写的类加载器。
  • extension class loader(扩展类加载器):是bootstrap class loader加载器的子类,用于加载扩展库。
  • system class loader(系统类加载器):是extension class loader加载器的子类,用于加载在classpath中的应用程序的类文件。
  • user-defined class loader(用户定义的类加载器):是系统类加载器或其他用户定义的类加载器的子类。

继承关系
用户自定义类->系统类->扩展类->引导类(父类

3. 执行引擎

解释执行:执行引擎把它遇到的每一条指令解释为机器语言。
即时编译(just in time,JIT):如果一条指令经常被使用,执行引擎会把它编译为本地代码(机器码)并存储在缓存中。这样,所有和这个方法相关的代码都会直接执行,从而避免重复解释。

4 内存模型

4.1 内存模型逻辑结构图

4.2 内存模型构成

  • 堆空间:存放JAVA程序创建的对象数据和数组数据,所有的线程在全局上是共享的
  • 方法区:所有的线程是共享的,存放构造器和方法所需要的代码,运行时的常量池
  • 本地区:线程的私有栈,堆中对象的引用值,本地变量等。

例子:

import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
public class HelloWorld {
    private static Logger LOGGER = Logger.getLogger(HelloWorld.class.getName());
    public void sayHello(String message) {
        SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.YYYY");
        String today = formatter.format(new Date());
        LOGGER.info(today + ": " + message);
    }
}

这段代码中各类数据在JAVA内存模型中所处的位置:

5. Java对象在堆空间中的生命周期

  1. Java创建了若干新的对象,放到新生代(Young Generation)当中的初生池(Eden pool,也叫伊甸池)当中
  2. 初生池满了之后,在新生代会进行一次小范围垃圾回收(minor GC),把死对象(不再被引用的对象)做好标记并清除。
  3. 进行minor GC之后,把其他活下来的对象放到新生代中的幸存池(Survivor)当中
  4. 当某个对象存活达到一定周期之后,就进入老生代(old generation)当中的终生池(tenured pool)
  5. 老生代被填满时,就进行一次major GC

注意点:

  • 新生代中的GC就是minor GC,在老生代中的GC就是major GC
  • 上帝造人之后把他们放在快乐的伊甸园,这个知道吧,所以有Eden pool,顺便说句,老外真会玩~哈哈
  • gc的时候所有线程要暂停
  • minor GC比major GC快

6. 优化方法

  1. 配置堆大小
  2. 配置新生代和老生代大小
  3. 设置不同的回收器(串行、并行、并发)

7. 监控

  1. JConsole工具
  2. Anturis控制台

参考文献

  1. http://ifeve.com/java-memory-model-6/
  2. http://ifeve.com/under-the-hood-runtime-data-areas-javas-memory-model/
  3. http://www.sxt.cn/u/756/blog/4764
  4. http://www.360doc.com/content/12/0113/08/1073512_179088229.shtml