jvm
java内存模型与分区:
本地方法栈
:native方法调用本地其他语言接口;
程序计数器
:记录当前线程的运行位置;
栈
:存放运行时的方法,包括:局部变量表、操作数栈、动态链接(指向常量池)和方法返回地址
。
堆
:初始化的对象、成员变量。
方法区
:
类型信息(加载类的类型(Class)、类的完整名称、类型修饰符等);
域信息(public);
方法信息(void、int);
全局变量(static final);
常量池(运行时常量池);
参数:
-Xss
:设置栈最大空间;
-Xms
:设置堆起始空间;
-Xmx
:设置堆最大空间;
指令:
jps
:查看当前程序运行的进程;
jstat -gc 进程号
:gc信息;
堆:
可设置线程私有的TLAB缓冲区;
新生代
,Survivor
(from
、to
),老年代
8 : 1 : 1
1 : 2
例:
Person person = new Person();
方法区
栈
堆
栈 -> 堆(对象实例数据) -> 方法区(对象类型数据)
栈 -> 堆 -> 方法区
对象头:
内容:运行时元数据、类型指针;
对象的访问定位:使用句柄、直接指针;
类加载子系统:
加载class文件。
过程
:加载、链接(验证、准备、解析)、初始化;
分类
:引导类加载器、启动类加载器、扩展类加载器;
双亲委派机制
:类加载器接到类加载请求,委托父类加载。
破坏双亲委派机制:重写loadClass和findClass;
StringTable:
Jdk9:byte[];
jdk8:存储在堆中;
垃圾回收算法:
引用计数法:循环引用导致回收失败;
可达性分析算法:GCRoots(可以是除堆之外的其他地方);
标记-清除算法
;
标记-整理算法
;
复制算法
;
分代收集算法;
强引用:new
对象,内存不够,报OOM都不回收;
软引用:new softReference,内存不够,回收;
弱引用:new WeakReference,遍历时,回收;
虚引用;
垃圾回收器:
新生代
:
Serial
:串行回收,复制算法;
ParNew
:并行回收;
Parallel
GC:吞吐量优先;
G1
;
老年代:
Serial Old
:串行回收,标记压缩算法;
CMS
:初始标记(STW
)、并发标记、重新标记(STW
)、并发清除;
优点:并发收集、低延迟;
缺点:碎片、CPU依赖、浮动垃圾;
G1
:区域化分代式,可控延迟,获取高吞吐量;
堆内存分割为区域;
初始标记(STW)、并发标记、再次标记(STW)、独占清理(STW)、并发清理