JDK1.5:引入java.util.concurrent包实现一个粗粒度的并发框架
JDK1.7:加入java.util.concurrent.forkjoin包对这个进行扩充
程序计数器:(虚拟机概念模型)当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等几区功能都需要依赖这个计数器来完成。
如果执行使Native方法,这个计数器值则为空(Undefined)
栈:
Java虚拟机栈描述的是java方法执行的内存模型,每个方法被执行的时候都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。线程私有。生命周期与线程相同。
本地方法栈为虚拟机使用到的Native方法服务。
堆:
存放对象实例,内存最大,所有线程共享,GC堆。
方法区(非堆):
与堆一样,线程共享,一别虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
运行时常量池:
方法区的一部分,存放编译期生成的各种字面量和符号引用。
直接内存:
不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,频繁被使用,例如NIO,chnnel和buffer,避免java对和Native堆来回复制数据。
Eclipse Memory Analyzer 工具分析内存泄露还是内存不够。
-Xms 堆内存设置
-Xss 减少栈内存容量
-XX:permSize和-XX:MaxPermSize限制方法区大小,间接控制常量池
-XX:MaxDirectMemorySize 直接内存控制
GC:
1. 引用计数算法,引用+1,不用-1,直到0被回收。
2. 根据搜索算法,引用链可达。
强引用:存在,不会被回收
软引用:内存溢出异常前,列入回收范围,二次回收
弱引用:生存到下次垃圾回收发生前
虚引用:无法取得对象实例
标记-清除算法:内存不连续,产生内存碎片
复制算法:简单高效,耗内存
标记-整理算法:整理存活
分代手机算法:新生代(复制),老年代(清楚或整理)
垃圾收集器
Jps:虚拟机进程状况工具
Jps: 【options】【hostid】
Jstat:虚拟机统计信息监视工具
Jinfo:java配置信息工具
Jmap:java内存映像工具
Jhat:虚拟机堆转储快照分析工具
Jstack:java堆栈跟踪工具
JConsole:java监视与管理控制台
VisualVM:多合一故障处理工具
魔数与Class文件的版本:
每个Class文件的头4个字节称为魔数,表示能被虚拟机接收的Class文件。
第5个和第6个字节表示次版本,第7个和第8个字节表示是主版本。
Javap 工具 分析Class文件字节码的工具
Javap –verbose TestClass
常量池 0x0016
验证:
1. 文件格式验证:
保证符合class文件规范,保证虚拟机可以处理
2. 元数据验证:
对类的元数据信息进行语义校验,保证不存在不符合java语言规范的元数据信息
3. 字节码验证:
主要工作是进行数据流和控制流分析
4. 符号引用验证:
对类以外的信息进行匹配性的校验(常量池中的各种符号引用)
准备:
正式位类变量分派内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
Public static int value = 123;准备初始值为0
Public static final int value = 123;
编译时javac将值生成ConstantValue属性;准备初始值为123
解析:
1. 类或接口的解析
2. 字段解析
3. 类方法解析
4. 接口方法解析
初始化:
类加载器:
通过一个类的全限定名来获取秒速此类的二进制字节流(虚拟机外部去实现)
类加载器在类的层次划分、OSGi、热部署、代码加密等领域大放异彩
虚拟机字节码执行引擎
执行引擎在执行java代码的时候可能有解释执行和编译执行这两种选择,也可能两者兼备,甚至还可能包含几个不同级别的编译器执行引擎。
栈帧:
支持虚拟机进行方法调用和方法执行的数据结构,虚拟机运行是数据区中的虚拟机栈的栈元素,存储了方法的局部变量、操作数栈、动态连接和方法返回地址等信息,没一个方法从调用开始到执行完成的过程,就对应这一个栈帧在虚拟机栈里面的从入栈到出栈的过程。
OSGI:灵活的类加载器架构
学习JEE规范,去看JBoss源码,学习类加载器,就去看OSGi源码。
Javac编译过程:
解析与填充符号表过程
插入式注解处理器的注解处理过程
分析与字节码生成过程