第一章 走进java:
java技术体系: 1, java程序设计语言。 2, java虚拟机。3,Class文件格式。4,java API
java技术体系分三个平台 :
JAVA ME(支持java运行在移动终端的平台)。
JAVA SE(支持面向桌面级应用的平台)。
JAVA EE(支持使用多层架构的企业应用的平台)
java 发展始:
1991年4月, 由James Gosling博士领导的绿色计划开始启动, 目的是开发一种在各种消费性
电子产品上运行的程序架构。这个产品就是java的前身:Oak(橡树)。
1995年5月23, Oak语言改名为java, 并发布1.0版本,口号: Write once, Run Anywhere,
JDK 1.5(老虎) JDK1.6(野马) JDK1.7(海豚)
目前sun已经取得了三大商业虚拟机中的二个 JRockit 和 Hotspot
第二章 JAVA内存区域与内存溢出异常
运行时数据区域
程序计数器:当前线程所执行的字节码的行号指示器。如果线程执行的
是JAVA方法,这个计数器所记录的是正在执行的虚拟机字节码指令的地址
如果线程执行的是native方法,这个计数器为空
Java虚拟机栈:线程私有的,与线程生命周期相同,用来存储局部变量表等等 (StackOverflowError和OutOfMemoryError)
本地方法栈:native方法服务 (StackOverflowError和OutOfMemoryError)
方法区: 各个线程
运行时常量池:是方法区的一部分。
java堆:分代收集算法。细分为:新生代(Eden, Fromsurvivor, ToSurvivor),老年代,持久代(OutOfMemoryError)
直接内存:(OutOfMemoryError)
第三章 垃圾收集器
无用的类:1,该类所有的实例都已经被回收, 也就是java堆中不存在该类的任何实例,
2,加载该类的ClassLoader已经被回收,
3,java.lang.Class对象没有在任何地方被引用
判断对象已死的算法:
1,引用计数算法,
给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就会加1
,当引用失效时,计数器值就会减1, 任何时刻计数器都为0的对象就是不可能再被使用的
缺点: objA.instance=objB , objB.instance=objA, 这时这两个对象已经不可能再被访问
,导致引用计数都不为0
2, 根搜索算法,
通过一系列名为”GC Roots“的对象作为起始点,从这些节点开始向下搜索,
搜索所走过的路径称为引用链(Reference Chain) 当一个对象到GCRoots
滑任何引用链相连(图论:从GCRoots到这个对象不可达)时,则证明此对象是不可用的。
GC Roots: 1, 虚拟机栈中引用的对象,2,方法区中的类静态属性引用的对象,
3,方法区中的常量引用对象,4,本地方法栈中JNI的引用的对象
垃圾收集算法:
1, 标记-清除算法(缺点:效率不高,空间碎片太多)
2,复制算法(将可用内存分成大小相等的两块每次只使用其中的一块,当这一块内存用完后
,就将还存活着的对象复制到另一块上面)IBM专门研究表明,新生代的对象98%都是早
生夕死的,所以并不需要按照1:1的比例来划分内存空间,Hotspot虚拟机默认Eden和Survivor的比例为8:1.
3,标记-整理算法(让所有存活的对象都向内存的一端移动,然后直接清理掉端边界的内存)
4, 分代收集算法 :新生代用 复制算法 , 老年代用”标记-清理“或者”标记-整理“的算法 。
垃圾收集器:
Serial 收集器: (新生代)
Stop the world:简单高效,在单个cpu的环境下面,Serial收集器没有线程交互的开销,可以获得很高的收集效率
ParNew收集器 (新生代)
Series收集器的多线程版本 , 使用-XX:+UserConcMarkSweepGC选项后默认的新生代收集器,
也可以用-XX:+UserParNewGC选项来强制指定他, -XX:ParallelGCThreads参数来限制垃圾收集器的线程数。
目前只有上述两种收集器与 CMS收集器配合工作。
Parallel Scavenge收集器(新生代,吞吐量优先收集器:控制最大停顿时间 和吞吐量大小)
Series Old收集器(老年代, 标记整理算法)
Parallel Old收集器(老年代,是Parallel Scavenge的老年代版本,注重吞吐量)
CMS收集器(Concurrent mark up, 标记-清除) 以获得最短回收停顿时间为目标的收集器。
优点,多次标记。
G1收集器(jdk1.7)
第四章: 工具
jstat -gc -gcutil输出已经使用空间占总空间的百分比
jmap -dump:format=b,file={file} , pid。
jconsole , visualvm