JVM问题
-
JVM三大性能调优参数 -Xms -Xmx -Xss 的含义
java -Xms128m -Xmx128m -Xss256k -jar -xxxx.jar
-Xss:规定了每个线程虚拟机栈(堆栈)的大小
-Xms:堆的初始值
-Xmx:堆能达到的最大值
-
内存分配策略
静态存储:编译时确定每个数据目标在运行时的存储空间需求
栈式存储:数据区需求在编译期未知,运行时模块入口确定
堆式存储:编译时或运行时模块入口都无法确定,动态分配
-
堆和栈的区别
管理方式:栈自动释放,堆需要GC
空间大小:栈比堆小
碎片相关:对产生的碎片远小于堆
分配方式:栈支持静态分配和动态分配,而堆仅支持动态分配
效率:栈的效率比堆高
-
不同JDK之间的String.intern()方法的区别 – JDK6和JDK6+
-
JDK6及之前:intern方法首先去查询常量池中是否存在该字符串,若有,返回的是对常量池中此字符串的引用;若无,在池中添加这个字符串,并且也返回对常量池中此字符串的引用。
-
JDK6之后:也是先去查询常量池中是否有这个字符串,若有,同上;若无,情况相比JDK6就不同了,只会在常量池生成一个对堆里这个字符串对象的引用,且返回之。
public static void main(String[] args) { String a4 = new String("AA"); //String a5 = "AA"; System.out.println(a4 == a4.intern());//注释掉上面一行就为false,反之为true }
上面的例子就展示了这一点。
-
GC相关
-
判断对象是否死亡
-
引用计数算法
优点:执行效率高,程序执行受影响较小
缺点:易产生死锁 – 两个对象循环调用,计数始终不为0
-
可达性分析算法
通过判断对象的引用链是否可达来决定对象是否可以被回收。
可以作为GC Root的对象:
- 虚拟机栈中引用的对象
- 方法区中的常量引用的对象
- 方法区中的类静态属性引用的对象
- 本地方法栈中JNI(Native方法)的引用对象
- 活跃线程的引用对象
-
-
谈谈了解的垃圾回收算法
-
标记-清除算法:碎片多,不连续
-
标记-清理算法
-
复制算法:适用于对象存活率低的场景
-
分代收集算法:
年轻代:复制
老年代:标记-清理
-
-
GC分类
-
MinorGC – 年轻代
一个Eden区,满了就复制算法,到survivor区;每次Minor GC,存货对象年龄+1,到达一定年龄(默认15岁)进入老年代;survivor区放不下时分配担保直接进老年代。
两个Survivor区
调优参数:
-XX:SurvivorRatio
:Eden和Survivor的比值,默认8:1-XX:NewRatio
:老年代和年轻代内存大小的比例-XX:MaxTenuringThreshold
:对象从年轻代晋升到年老代经过GC次数的最大阈值
-
FULL GC和Major GC – 老年代
触发条件:
- 老年代空间不足
- 永久代空间不足(JDK7及之前)
- CMS GC时出现promotion failed, concurrent mode failure
- Minor GC晋升到老年代的平均大小大于老年代的剩余空间
- 调用System.gc()
- 使用RMI(远程方式)来进行RPC来管理的应用,每隔一小时
-
-
常见垃圾收集器
新生代常用
Serial收集器(-XX:+UseSerialGC,复制算法)
- 单线程,有停顿时间
- 简单高效
ParNew收集器(-XX:+UseParNewGC,复制算法)
- 多线程,其余行为特点和Serial一样
- 单核下没有Serial效率高
Parallel Scavenge收集器(-XX:+UseParallelGC,复制算法)
- 更关注系统吞吐量
- 多核有优势,Server模式下默认
老年代常见
Serial Old
Parallel Old(-XX:+UseParallelOldGC,标记-整理算法)
- 多线程,吞吐量优先
- 配合Parallel Scavenge
CMS收集器(-XX:+UseConcMarkSweepGC,标记-清除算法)
无法和Parallel Scavenge配合
- 初始标记:stop-the-world
- 并发标记
- 并发预清理
- 重新标记:stop-the-world
- 并发清理
- 并发重置
G1收集器(-XX:UseG1GC,复制+标记-整理算法)
- 将整个Java堆内存划分成多个大小相等的Region
- 年轻代和老年代不再物理隔离
GC问题
-
finalize方法
给予对象一次重生机会。不建议使用
-
四个引用
-
强引用:Object obj = new Object()
抛出OOM也不会回收
要回收,需要设置为null来弱化引用
-
软引用(SoftRefence)
有用非必须
当内存空间不足时,GC会回收该引用的对象的内存
可以用来实现高速缓存
-
弱引用(WeakRefence)
非必须
GC被收回
-
虚引用(PhantomRefence)
不会决定对象的生命周期
任何时候都会被引用
作标记用途,对象被收回时会有一个通知
引用队列(ReferenceQueue)
- 无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达
- 存储关联的且被GC的软引用,弱引用以及虚引用
-
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/19385.html