JVM总结

一、类加载器(四种)

1、BootStrap class loader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类。

2、Extension class loader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包。

3、App ClassLoader

负责记载classpath中指定的jar包及目录中class

4、Custom ClassLoader

属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader。

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。


二、内存管理及垃圾回收机制

内存主要有三大块:堆内存、方法区和栈。

堆:由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配。

方法区:存储类信息、常量、静态变量及即时编译器编译后的代码等数据。

栈:分为Java栈和Native栈(即那些C++代码的调用栈)

垃圾回收算法:Java采取可达性分析法。该方法的基本思想是通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。

Java不使用引用计数法,因为它无法解决循环引用的问题,比如两个在堆内的对象,它们存在互相引用,但这两个对象本身已经不再使用了,使用引用计数法将永远无法回收该两个对象。


三、常用工具及命令

jstack:用于生成java虚拟机当前时刻的线程快照。

    线程包括很多状态:

    NEW:未启动的。不会出现在Dump中。

    RUNNABLE:在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。

    BLOCKED:受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。

    WATING:无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(), join() 等语句里。

    TIMED_WATING:有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。

    TERMINATED:已退出的。

jmap:用于生成heap dump文件。

MAT:内存分析工具,分析heap dump文件,解决内存泄露问题。

你可能感兴趣的:(JVM总结)