> 茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!
>
> 愿你在未来的日子,保持热爱,奔赴山海!
>
> 今天父亲节,希望未来的
我有能力替父亲撑起这个家吧!一起加油成长!
# 每日三道面试题,成就更好自我
> 今天我们继续聊聊JVM的话题吧!
## 1. 那你知道什么时候才会触发Full GC
1. 在老年代空间不足的时候:
老年代空间只有在新生代对象发生mi
nor Gc转入或者是直接创建为大对象、大数组时出现空间不足的现象,当JVM执行Full GC后空间仍然不足,则抛出如下
错误:`
java.lang.OutOfMemoryError: Java heap space`。
解决措施:尽量做到让对象在Mi
nor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。
2. 在我们程序中直接
调用了Sy
stem.gc, 也会直接出发Full GC。
3. 在永久代空间满
永久代中存放的为一些class的信息等,当系统中要加载的类、反射的类和
调用的
方法较多时,永久代空间可能会被占满,在未配置的时候采用这CMS
垃圾收集器的情况下会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下
错误信息:`
java.lang.OutOfMemoryError: PermGen space`。
解决措施:可采用的
方法为增大永久代空间或转为使用CMS GC。
4. 在CMS
垃圾收集器出现promotion
Failed(晋升失败)和concurrent mode failure(并发模式故障)
对于如果我们采用CMS
垃圾收集器进行老年代GC的程序而言,我们就需要主要在GC日志中是否有晋升失败和并发模式故障两种状况,当这两种状况出现时可能会触发Full GC:
晋升失败(promotion
Failed) 是在新生代进行Mi
nor GC时,幸存区中放不下、而对象只能放入老年代,而此时老年代也放不下造成的。
concurrent mode failure是CMS转悠的
错误,即并发清楚线程和工作线程同时工作,清理出来老年代的空间不足以存放由新生代晋升到老年代的对象。
解决措施:减少年轻代大小,避免放入老年代时需要分配大的空间,同时调整触发Full GC时的比率以及将触发CMS GC的阀值适当增大
> 不错不错,这都难不倒你!
## 2. JVM中四种引用你有了解过吗?
* 强引用:
垃圾收集器不会回收被强引用的对象。
在 Java 中最常见的就是强引用, 把
一个对象赋给
一个引用变量,这个引用变量就是
一个强引用。即在我们写类似这样`User user = new User()`,我们new出来的`user`对象就是
一个强引用了!
当
一个对象被强引用变量引用时,它处于可达状态,它是不可能被
垃圾回收机制回收的即使在内存不足的情况下,JVM宁愿抛出`OutOfMemory`
错误也不会回收这种对象。
* 软引用:在没有被强引用对象,当系统要发生内存溢出的异常之前,会将其列为回收范围,进行第二次回收。
软引用需要用 SoftReference 类来实现,对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内存空间不足时它会被回收。软引用通常用在对内存敏感的程序中。
*
弱引用:具有
弱引用的对象拥有更短暂的生命周期。在没有被强引用对象,只能存活在下一次
垃圾收集器前。无论内存够不够。
弱引用需要用 WeakReference 类来实现,它比软引用的生存期更短,对于只有
弱引用的对象来说,只要
垃圾回收机制一运行,不管 JVM 的内存空间是否足够,总会回收该对象占用的内存。
* 虚引用:无法通过虚引用取得
一个对象实例,设置虚引用的目的是为了能
在这个对象被
垃圾收集器回收时收到
一个通知。 虚引用的主要作用是跟踪对象被
垃圾回收的状态。
> 可以,那问你最后一道:
## 3. 说说你知道的几种主要的JVM参数
1. 堆设置
- **-
xms**:初始堆大小
- **-Xmx**:最大堆大小
- **-XX:NewSize=n**:设置新生代大小
- **-XX:NewRatio=n:**设置年轻代和年老代的比值。如:为3,表示新生代与老年代比值为1:3,新生代占整个新生代老年代和的1/4
- **-XX:SurvivorRatio=n**:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,
一个Survivor区占整个新生代的1/5
- **-XX:MaxPermSize=n**:设置持久代大小
2. 收集器设置
- **-XX:+UseSerialGC**:设置串行收集器
- **-XX:+UseP
arallelGC**:设置并行收集器
- **-XX:+UseP
aralledlOldGC**:设置并行老年代收集器
- **-XX:+UseCon
cmarkSweepGC**:设置并发收集器
3. 并行收集器设置
- **-XX:P
arallelGCThreads=n**:设置并行收集器收集时使用的
cpu数。并行收集线程数。
- **-XX:MaxGCPauseMillis=n**:设置并行收集最大暂停时间
- **-XX:GCTimeRatio=n**:设置
垃圾回收时间占程序运行时
间的百分比。公式为1/(1+n)
4. 并发收集器设置
- **-XX:+CMSIncrementalMode**:设置为增量模式。适用于单
cpu情况。
- **-XX:P
arallelGCThreads=n**:设置并发收集器新生代收集方式为并行收集时,使用的
cpu数。并行收集线程数。
5. JVM 调优的参数
- **-
xms2g:**初始化推大小为 2g;
- **-Xmx2g:**堆最大内存为 2g;
- **-XX:NewRatio=4:**设置年轻的和老年代的内存比例为 1:4;
- **-XX:SurvivorRatio=8:**设置新生代 Eden 和 Survivor 比例为 8:2;
- **–XX:+UseParNewGC:**指定使用 ParNew + Serial Old
垃圾回收器组合;
- **-XX:+UseP
arallelOldGC:**指定使用 ParNew + ParNew Old
垃圾回收器组合;
- **-XX:+UseCon
cmarkSweepGC:**指定使用 CMS + Serial Old
垃圾回收器组合;
- **-XX:+PrintGC:**开启打印 gc 信息;
- **-XX:+PrintGCDetails:**打印 gc 详细信息。
> 小伙子不错嘛!今天就到这里,期待你明天的到来,希望能让我继续保持惊喜!
注: 如果
文章有任何
错误和建议,请各位大佬尽情留言!如果这篇
文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!也可以微信
搜索太子爷哪吒公众号私聊我,感谢各位大佬!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。