java虚拟机调优——笔记
马士兵java虚拟机调优笔记
主讲内容:
JAVA内存结构
|
GC确定垃圾
1、引用计数
会有循环引用的问题-多个NULL对象互相引用
2、正向可达
从roots对象计算可以到达的对象
拓展:
强引用(StrongReference):这是Java程序中最常用的引用方式。程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用变量来操作实际的对象。当一个或一个以上的引用变量被引用时,它处于可达状态,不可能被系统垃圾回收机制回收。
软引用(SoftReference):软引用需要通过SoftReference类来实现,当一个对象只有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收。当系统内存空间不足时,系统可能回收它。软引用通常用于对内存敏感的程序中。
弱引用(WeakReference):弱引用通过WeakReference类实现,弱引用和软引用很像,当弱引用的引用级别更低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然,并不是说当一个对象只有弱引用时,它就会立即被回收——正如那些失去引用的对象一样,必须等到系统垃圾回收机制运行时才会被回收。
虚引用(PhantomReference):虚引用通过PhantomReference类实现,虚引用完全类似于没有引用。虚引用对对象本身没有太大影响,对象甚至感觉不到虚引用的存在。如果一个对象只有虚引用时,那么它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用。
垃圾回收算法
Mark-Sweep 标记清除
|
Copying 复制
|
Mark-Compact 标记压缩
|
JVM采用分代算法
new
存活对象少
使用copying,占用的内存空间也不大,效率也高
old
垃圾少
一般使用Mark-Compact
JVM中的垃圾收集器
Serial Collector
-XX:+UseSerialGC
单线程
Parallel Collector/Throughout Collector
-XX:UseParallelGC
并发量大,不过每次垃圾收集,JVM
The Most Concurrent Collectors
CMS Collector
停顿时间短
G1
不仅停顿短,同时并发大
JVM参数
- 标准参数,所有JVM都应该支持
-X 非标准参数,每个JVM实现都不同
-XX 不稳定参数,下一个版本可能会取消
Java对象的分配
栈上分配
线程私有小对象
无逃逸
支持标量替换
无序调整
线程本地分配TLAB(Thread Local Allocation Buffer)
占用eden,默认1%
多线程的时候不用竞争eden就可以申请空间,提高效率
小对象
无需调整
老年代
大对象
eden
堆内存参数调整
|
用VisualVM观察虚拟机堆信息(在jdk/bin/jvisualvm.exe)-查看栈信息打印的信息
调优Tomcat并使用JMeter进行评测
到Tomcat\bin\catalina.bat start
|
|
参考资料:
|