走进Java
JDK
JDK(Java Development Kit)是用于支持Java程序开发的最小环境,包括 Java程序设计语言、Java虚拟机、Java API类库。
JRE
JRE(Java Runtime Enviroment)是支持Java程序运行的标准环境,包括Java SE API子集和Java虚拟机。
Java内存区域划分
程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。每个线程有一个私有的程序计数器,所以属于线程私有的内存。
Java虚拟机栈(Java Virtual Machine Stack )也是线程私有的,他的生命周期与线程相同。每个方法在执行的时候都会创建一个栈帧(Stack Frame)用于储存局部变量表、操作数栈、动态链接、方法出口等信息。一个方法的执行到结束,都对应着一个栈帧在虚拟机栈的入栈和出栈。
本地方法栈 与虚拟机栈相似,只是对应于Native方法。
方法区(Method Area) 是线程共享区域,它用来储存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
堆 用来存放Java对象
垃圾回收与内存分配策略
对象存活判定算法
引用记数算法不能解决循环引用的问题。Java采用可达性分析算法(Reachablity Analysis)来判定对象是否存活。
可作为GC Roots的对象包括下面几种:
- 虚拟机栈中引用的对象
- 方法区中静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI引用的对象
垃圾回收算法
-
标记-清理算法(Mark-Sweep)
效率问题和内存碎片问题 -
复制算法
不会有内存碎片,只用对半个区进行回收,但内存缩小到一半。商业虚拟机大部分采用这种算法。一个Eden两个Survivor,大小8:1。缺点,老年代浪费效率。 -
标记-整理算法(Mark-Compact)
对于老年代比较合适,只需移动部分存活对象填补内存空缺。
垃圾收集器
G1(Garbage-First)收集器是当今技术发展的最前沿成果之一。它是一款面向服务器应用的垃圾收集器。他的特点如下:
- 并行与并发
可利用多CPU、多核环境下的硬件优势,使用多个CPU缩短Stop-the-world停顿的时间。 - 分代收集
- 空间整合
- 可预测的停顿
内存分配策略
- 对象优先在Eden分配
- 大对象直接进入老年代
- 长期存活的对象将进入老年代