Java内存区域
1.程序计数器(Program Counter Register)(线程私有的)
2.Java虚拟机栈 (Java Virtual Machine Stacks)(线程私有的)
3.本地方法栈 (Native Method Stack)(Native方法)
4.Java堆 (Java Heap)(线程共享)
5.方法区 (Method Area)
6.常量池 (Runtime Constant Pool)
7.直接内存 (Direct Memory)(不是java虚拟机规范定义的内存区域)
对象的创建
为对象分配空间
指针碰撞(Bump the Pointer) —— Serial、ParNew等带Compact过程的收集器gc
空闲列表(Free List) —— CMS基于Mark-Sweep算法的收集器
对象的访问定位
1.句柄访问
2.直接指针访问
句柄访问
优势:reference中存储的是稳定的句柄地址,对象被移动reference不需要改变
通过句柄访问对象
直接指针访问
优势:速度更快,节省了一次指针定位的时间开销
通过直接指针访问对象
JVM内存参数:
堆的最小值:-Xms
堆的最大值:-Xmx
新生代容量:-Xmn
栈内存容量:-Xss
常量池的最小值:-XX:PermSize
常量池的最大值:-XX:MaxPermSize
DirectMemory容量:-XX:MaxDirectMemorySize
编译时间和垃圾回收时间
Hot Spot Code 编译热点代码
GC垃圾回收
Full GC
Minor GC
引用计数算法
可达性分析算法 GC Roots开始,不可达则证明不可用
强引用,软引用,弱引用,虚引用;
两次标记
垃圾回收算法:
标记—清除算法(Mark-Sweep)
复制算法(Coping) Eden空间和Survivor空间
标记—整理算法(Mark-Compact)
分代收集算法(Generational Collection)
垃圾收集器
Serial收集器 单线程的、JDK1.3.1之前的 、Stop The World
ParNew收集器 Serial的多线程版本、新生代
Parallel Scavenge收集器 新生代收集器、使用复制算法、可控制的吞吐量
Serial Old收集器 老年代,单线程、标记-整理算法
Parallel Old收集器 Parallel Scavenge的老年代版本、多线程、标记-整理算法
CMS收集器 并发收集、低停顿时间、标记-清除算法
G1收集器 并行与并发、分代收集、空间整合、可预测停顿
JDK监控命令行工具:
jps:虚拟机进程状况工具 jps -l
jstat:虚拟机统计信息监控工具 jstat -gc 2372 20
jinfo:Java配置信息工具 jinfo -flag CMSInitiatingOccupancyFraction 2372
jmap:Java内存映射工具 jmap -dump:format=b,file=eclipse.bin 2372
jhat:虚拟机堆转储快照分析工具 jhat eclipse.bin 然后在浏览器中输入localhost:7000查看
jstack:Java堆栈跟踪工具 jstack -l 2372
JConsole工具
VisualVM工具