Java内存模型 (JMM) 硬件内存架构
1.8 堆 栈 本地栈 计数器 元空间
常量池、运行时常量池、字符串常量池、静态变量、方法区 在哪
常量池又称静态常量池,在class类里面,初始化的是后被加载到运行常量池中
运行时常量池在元空间(方法区)中
字符串常量池在堆中
静态变量在元空间(方法区)中
方法区是jmm理论模型中的东西,hotsport在1.7实现叫做永久代,在1.8是元空间
逃逸分析、栈上分配?
经过逃逸分析的对象被分配到栈上。对象只存在与方法中,没有跳出方法的引用对象,可以称作逃逸对象。
jvm报错 怎么排查
先根据六大不同的oom(堆 栈 元空间 直接内存 线程个数 gc时间过长)异常定位分析代码
如何还分析不出来,那么启动的是后增加参数( -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dmdump.bin),在oom的是后输出详细的日志,在根据详细的日志进行分析
默认的堆大小
默认 最小(-Xms1024m)是物理内存的1/64,最大(-Xmx1024m)是物理内存的1/4
年轻代 老年代 比例
1:2
年轻代三个的比例
8:1:1
8 1 1为什么是这个比例
百分之90的对象都朝升夕灭
默认栈
512k 到 1024k
垃圾回收的算法
引用计数法 、复制、标清、标整
有哪些垃圾回收器,他们的算法是什么
serial 复制
parNew 复制
paraller scavenge 复制
cms 标清
serialOld 标整
ParallerOld 标整
g1 类似 标清 + 标整
垃圾回收器默认是什么
paraller scavenge ParallerOld
为什么要有stw?
没有stw无法找出完全垃圾对象,会有浮动垃圾
jvm调优调的是什么?
减minor-jc,避免full-jc
怎么做的jvm调优么?
根据业务需求估算,业务中经常被使用的对象多大;
被会被利用完的一个周期是多长时间;
尽量往大了估算,用上限;
尽量让这些对象死在年轻代
进入老年来的条件
对象经过几次垃圾回收,熬到设定的年龄阈值,就会晋升到老年代。
如果直接分配大对象,该大对象超出了JVM设置的限定值,就会直接分配到老年代。
在一次新生代GC后,存活下来的对象不太多,Survivor区域中的几个年龄对象加起来超过了Survivor区内存的一半,那么根据动态年龄判定规则,从最小的年龄加起,比如年龄1+年龄2+年龄3的对象大小总和,超过了Survivor区内存的一半,此时年龄3以上的对象就会晋升老年代。
新生代GC后,存活下来的对象太多,Survivor区放不下,此时对象直接晋升老年代。