茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!

愿你在未来的日子,保持热爱,奔赴山海!

每日三道面试题,成就更好自我

今天我们继续聊聊JVM的话题吧!

1. 那你知道什么时候才会触发Full GC

  1. 在老年代空间不足的时候:

    老年代空间只有在新生代对象发生minor Gc转入或者是直接创建为大对象、大数组时出现空间不足的现象,当JVM执行Full GC后空间仍然不足,则抛出如下错误:java.lang.OutOfMemoryError: Java heap space

    解决措施:尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

  2. 在我们程序中直接调用了System.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) 是在新生代进行Minor 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:+UseParallelGC:设置并行收集器
    • -XX:+UseParalledlOldGC:设置并行老年代收集器
    • -XX:+UseConcMarkSweepGC:设置并发收集器
  3. 并行收集器设置

    • -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

    • -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

    • -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

  4. 并发收集器设置

    • -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

    • -XX:ParallelGCThreads=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:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
    • -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
    • -XX:+PrintGC:开启打印 gc 信息;
    • -XX:+PrintGCDetails:打印 gc 详细信息。

小伙子不错嘛!今天就到这里,期待你明天的到来,希望能让我继续保持惊喜!

注: 如果文章有任何错误和建议,请各位大佬尽情留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!也可以微信搜索太子爷哪吒公众号私聊我,感谢各位大佬!

每日三道面试题,通往自由的道路6——JVM的更多相关文章

  1. 每日三道面试题,通往自由的道路5——JVM

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然我们聊到了JVM,那我们继续这一个话题 ...

  2. 每日三道面试题,通往自由的道路4——JVM篇

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然你有讲到字符串常量池是吧,那这样吧 1 ...

  3. 每日三道面试题,通往自由的道路10——JMM篇

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 今天我们还是继续聊聊多线程的一些其他话题吧! ...

  4. 每日三道面试题,通往自由的道路13——锁+Volatile

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 我们既然聊到了并发多线程的问题,怎么能少得了锁 ...

  5. 每日三道面试题,通往自由的道路14——MySQL

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天我们是不是聊到了锁,而你提到了MySQL? ...

  6. 每日微软面试题——day 6(打印所有对称子串)

    每日微软面试题——day 6(打印所有对称子串) 分类: 2.数据结构与算法2011-08-14 14:27 9595人阅读 评论(15) 收藏 举报 面试微软string测试systemdistan ...

  7. 三道JS试题(遍历、创建对象、URL解析)

    最近在网上看到了三道不错的JS试题,还是很基础(一直认为学好前端基本功很重要...),现在记录如下: 原帖地址:http://www.w3cfuns.com/forum.php?mod=viewthr ...

  8. 8月份21道最新Java面试题剖析(数据库+JVM+微服务+高并发)

    前言 纵观几年来的Java面试题,你会发现每家都差不多.你仔细观察就会发现,HashMap的出现几率未免也太高了吧!连考察的知识点都一样,什么hash碰撞啊,并发问题啊!再比如JVM,无外乎考内存结构 ...

  9. 【高频Java面试题】简单说说JVM堆的内存结构和GC回收流程

    目录 前言 JVM堆内存结构简述 JVM堆内存结构图 堆初体验 结构详情 新生代 老年代 永久代/元空间 GC回收流程 GC回收流程图 GC回收详细流程 查看JDK自带可视化堆空间图 总结 前言 我们 ...

随机推荐

  1. Java并发编程(二)如何保证线程同时/交替执行

    第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...

  2. 浙江省第三届大学生网络与信息安全竞赛WP

    title: 浙江省第三届大学生网络与信息安全预赛WP date: 2020-10-2 tags: CTF,比赛 categories: CTF 比赛 浙江省第三届大学生网络与信息安全竞赛WP 0x0 ...

  3. ajax 异步无刷新点改

    <button class="status" t_id="{{$v->id}}">{{$v->status}}</button&g ...

  4. xl release 安装

    前提,该版本需要jdk-1.8以上(包括1.8),内存大于等于2G,磁盘最小空间2G,操作系统windows或者unix-family xl release是一个端到端的管道编排工具. 下载XL-re ...

  5. 大数据 什么是 ETL

    ETL 概念 ETL 这个术语来源于数据仓库,ETL 指的是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程.ETL 的目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提 ...

  6. linux进程间通信-(转自 临水)

    一.进程间通信概述进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别 ...

  7. #undef 与 exit(0) 使用

    #undef  与 #defined 反,实际使用中较多的是当你需要使用自己定义的标准C里面已经的函数时可以这样操作: exit(0)和exit(1)是系统判断函数是否有正常的退出,一般0表示正常的退 ...

  8. RAM与FLASH

    以前一直使用STM32但是对 变量 或 函数 的存储域没做任何了解:只知道你需要存储的东西就放在Flash的后面几页就好了:这次接触到STM8发现编译器里面有特别的存储查看器就打算看看到底是怎么存储的 ...

  9. java_[类加载器]

    Class 与 类加载 Class对象由JVM自动产生,每当一个类被加载时,JVM就自动为其生成一个Class对象,通过Class对象可以获得类的相关信息. 将类信息读到内存中过程,称为类加载 Jav ...

  10. C# DeepClone 深拷贝

    常规利用反射进行克隆 public static T CloneModel<T>(T oModel) { var oRes = default(T); var oType = typeof ...