JDK8
堆区
young eden s0+s1 eden+survivor s0/s1 from/to
new出来的对象首先分配在eden区,当eden区满了会触发第一次GC;
活的==》s0(from)
再次触发GC:eden+from=>s1(to)
对象年龄+1 15 MaxTenuringThreshold ==>老年代
面试题 JVM 调优、参数配置
oracle
-XX:SurvivorRatio=8 eden:s1+s0比例
-XX:NewRatio=2 新生代占比
-XX: MaxTenuringThreshold=15 =0(年轻代对象直接进入老年代)
old
非堆区 Metaspace (PermGen)
Metaspace:Class package Method Filed 字节码 常量池 压缩
独立于堆区之外
CCS CodeCache
JMM (java内存模型)
voletile 关键字 保证一致性 原子性 可见性
确定哪些对象会被回收
1)引用计数 父类引用指向子类对象 (多态)
A a = new A() a.eat()
B b= new B() b.set(a)
循环引用
2) 枚举根节点可达性
GC Roots
谈谈你的GC算法的了解
标记-清除 Mark-Sweep
标记 GC Roots==》找到存活的对象 标记
清除:将没有标记的对象全部干掉
缺点: 内存碎片
复制 Copy
内存划分为2个区域 同一时间点只有一个是活动的
GC 线程会将活动区域的存活对象全部复制到空闲区域,排序
新生代GC用的比较多
缺点:真正能用的内存只有一半
标记-整理 Mark-Compact
分代 (综合使用)
新生代:复制
老年代:标记清除/标记整理
谈谈你对 GC Collect的看法
结合Spark你来说说你线上遇到过得OOM异常以及解决方案
1)Spark内存模型
2)Spark架构
3)JVM OOM
StackOverflowError
Java Heap Space OutofMemory -xms -xmx Executor
unable to create native thread OutofMemory
ulimit -u 4096 3701(挂掉) 其他线程也在使用
etc/secutity/limits.d