java常用指令:
查看字节码指令:
javap -c helloworld.class > helloworld.txt
查看Java进程使用垃圾回收器相关信息指令:
第一步:通过JPS -l 可以获取需要查询java进程号;
第二步:jinfo -flag UserConCMarkSweepGC 进程号。备注:查看该进程是否采用的是CMS收集器
类加载机制:
双亲委派模式:
Run-Time Data Areas 运行时数据区域:
JVM Stacks 工作原理:
JVM对象内存布局:
JVM内存模型:
Heap 内存中Old、Young(Eden、S0【From】、S1【To】)说明:
Eden:S0:S1 = 8:1:1 ,因为大部分对象都是“朝生夕死”
Young区包含:Eden和S区:Minor GC
Old区:Major GC,Major GC 通常伴随Minor GC,也就是触发Full GC
Young + Old = Full GC
每次GC都会TSW(The Stop World),暂停所以用户线程。尽量少些触发Full GC(减少Full GC的触发频率)
S0和S1保证每次都有一个是空闲的,可以避免内存不连续(内存碎屏)而导致浪费,采用的是复制算法。
每次GC,对象的年龄都会+1,默认老年代的年龄>15岁。
Heap 内存对象申请与GC触发流程:
GC ROOT:
判断GC ROOT 两种策略:1.引用计数;2.可达性分析,由它出发,某个对象是否可达。一般都是采用可达性分析。
a.虚拟机栈的本地变量
b.static 变量、常量引用
c.本地方法中的变量【Thread:C】
d.Thread java线程
c.类加载器:如果它找到一条线路,能够到底某个对象,这个对象也不能称为垃圾。
GC垃圾回收算法
1.标记---清除
2.标记---整理
3.复制算法
GC垃圾收集器,主要是针对垃圾回收算法的应用
1.新生代:Serial、ParNew、Parallel Scavenge、G1
Serial 单线程
ParNew 多线程(并发)
Parallel Scavenge 多线程,并关注“吞吐量”,吞吐量=用户应用执行时间/业务代码执行时间+垃圾收集的时间
以上收集器都是采用的复制算法:适用内存中活跃的对象越少,减轻复制的成本,因为新生代中大多数对象都是“朝生夕死”。
2.老年代:Serial Old、Parallel Old、CMS(concurrent mark sweep---关注“停顿时间”)、G1
Serial Old 单线程
Parallel Old 多线程、吞吐量等
CMS 并发收集器,用户线程和垃圾线程一起执行(CPU切换)
以上收集器采用的是标记-整理/清楚算法。
对堆进行重新布局,平分大小统称为Region 区域,逻辑上还是有Old、Eden、S0、S1区别,物理上已经不是隔离的。
CMS和G1收集器的说明:
CMS:比较关注的是停顿时间---降低吞吐量的要求
G1:可以设置用户停顿时间,比如:set pause time = 15ms
JVM调优:
(1)、GC收集器:停顿时间和吞吐量
停顿时间[set pause time]:垃圾收集器进行垃圾回收Client执行响应的时间---->用户端很好的体验--->适用于用户交互场景比较频繁,eg:web 应用。
吞吐量:运行用户代码时间/(运行用户代码时间+垃圾收集器执行时间 ),适用于用户代码执行占用CPU资源的时间比较大,比如:跑任务,运算的任务。
停顿时间比较小:CMS和G1(set pause time,not strict 15ms) 适用于Web应用---->并发类收集器
吞吐量优先:Parallel Scavenge 和Parallel Old ----->并行类收集器
窜行收集器:Serial 和Serial Old ------>内存比较小,嵌入式的设备
(2)、内存使用的维度