jvm相关
java程序(编译)——class文件——jvm解释——转化为不同平台的交易码——execute()
主要文件:jvm.cfg(jre/lib/amd64/)
与jvm.dll(jre/bin/server/)jvm的主要实现,初始化jvm,并且获取JNI(Java Native Interface)接口
内存空间:方法区、堆、栈、本地方法栈
方法区:各线程共享区,存放类信息、常量、静态变量
堆:类的实例 OutOfMemory
栈:线程私有区域 StackOverflow
本地方法栈:调用本地方法库,实现与硬件及OS交互
PC寄存器:执行内容及顺序
执行引擎:根据PC寄存器调配的指令顺序,依次执行程序指令
内存模型:主内存、工作内存
可见性:volatile
1、线程1工作内存中变量更新强制写入主内存
2、线程2工作内存变量失效,重读
重排序:
源代码——编译器优化重排——指令级并行重排——内存系统重排——最终执行的指令序列
垃圾回收:stop the world
引用计数: java未采用
1、频繁的计数影响性能
2、无法处理循环引用
标记清除:
标记:遍历所有的GC Roots,将其可达对象标记为存活
清除:遍历堆中所有对象,未标记对象清除
1、遍历所有内存,‘stop the world’过长,吞吐量低
2、清除对象内存不连续
标记压缩:标记清除+压缩:解决内存不连续
复制:内存一分为二,将正在使用的存活对象复制一份,删除之
1、存活对象多时不适用
2、内存空间占用成本高
GC: jdk1.8元数据区(内存)——(1.7永久区)
eden——S0——S1——tenured
from to
串行收集器Serial:使用单线程进行垃圾回收
新生代:复制 老年代:标记压缩
-XX:+UseSerialGC
并行收集器:
ParNew:新生代并发回收,老年代串行回收,算法同串行
-XX:UseParNewGC
-XX:ParallelGCThreads 指定线程数,一般等同于CPU核数
Parallel:
1、同ParNew,更重视吞吐量,性能更优
-XX:UseParallelGC
2、对新生代及老年代均并行回收
-XX:UseParallelOldGC
CMS : Current Make Sweep 并发标记清除
可与程序并发执行,只适用老年代
-XX:UseConcMarkSweepGC
-XX:ConcGCThreads设置线程数
-XX:CMSInitiatingOccupancyFraction CMS回收阈值,默认68(即老年代68%回收)
注意:不能与Parallel Scavenge一起工作,只能选择ParNew或Serial
初始标记——并发标记——重新标记——清除
1、减少停顿时间
2、回收不彻底
3、吞吐量大
G1:Garbage First 分区算法
将堆划分为互相独立的区块,用相对较少的时间清理垃圾最多的区块
-XX:USeG1GC
1、回收时减小了内存碎片的产生
2、适用于新生代+老年代
类加载器:
类加载(加载——连接(验证——准备——解析)——初始化)——使用——卸载
加载:1、通过.class的路径读取到二进制流
2、二进制流元数据(类型、常量等)载入方法区
3、在堆中生成对应的java.lang.Class对象
连接:
1、验证:判断class文件合法性
2、准备:分配内存
3、解析:将符号引用替换为直接引用
初始化:执行类的构造方法、static相关
性能工具:jVisualVM.exe
MemoryAnalyzer.exe
优化:本质上是减少GC的次数
如果是频繁创建对象的引用,可↑新生代
常量较多:↑持久代
单例较多:↑老年代 eg:spring