2024年Go最新【面试大全-JVM】必备JVM_jvm内存模型这块面试怎么准备(4),2024年最新隔壁都馋哭了

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

谈谈对象分配规则
  • 对象有限分配在Eden区,如果没有足够的空间,则进行MinorGC
  • 大对象直接进入老年代,这样做是避免内存中进行拷贝(新生代采用复制算法收集内存)
  • 长期存活的对象进入老年代,
描述下JVM加载class文件原理机制
  • JVM的加载是由类加载器(ClassLoader)和它的子类来实现的,当Java程序需要某个类时,JVM确保这个类已经被加载、验证、准备、解析、初始化等操作,类加载就是把.class文件读取到内存中,通常创建一个字节数组进行存取。
  • 类加载机制采用了双亲委派机制进行加载、保证了平台的安全性。
关于类的生命周期
  • 加载、查找并加载二进制数据、在Java堆中创建一个Class类的对象。
  • 连接(验证、准备、解析)
  • 初始化:类赋值
  • 使用:new出对象
  • 卸载:执行垃圾回收
如何判断对象可以被回收
  • 引用计数:每个对象都有一个引用计算属性、新增一个引用+1,引用释放-1,计数为0时可以回收,次方法简单,无法解决对象互相引用问题。
  • 可达性分析:从GC Roots开始向下搜索,搜索所经过的路径称为引用链,当一个对象从GC Roots没有任何引用链时,则证明次对象是不可用的,可进行回收。
垃圾回收算法
  • 标记-清除算法:算法分别是标记和清除两个阶段、首先标记出所需要清理的对象,在标记完成后统一对标记的对象进行回收。
  • 复制算法:讲可用的容量划分为相等的两块,每次只使用其中的一块,当一块内存要用完了的时候,就将存活的对象复制到另一块上面,然后把已经使用过的一块全部清楚。
  • 标记-压缩算法:标记和标记-清除算法中一致,让所有存活的内存都移向一边,然后清理掉端边界以外的内存。
  • 分代收集算法:把堆内存分为新生代和老年代,这样可以根据不同年代的特点采用最适合的垃圾收集算法。
调优的命令有哪些
  • jps:显示指定系统内所有HotSpot虚拟机进程
  • jstat:用于监视虚拟机运行时状态命令,显示虚拟机内存,垃圾回收等。
  • jmap:生成 heap dump文件
  • jstack:生成当时的线程快照
  • jinfo:实时查看和调整虚拟机的运行参数
常见的调优工具
  • jconsole:jdk自带的监控控制台
  • Java VisualVM:内存快照、线程快照。
  • arthas 阿里巴巴开源 命令查看
为什么将-Xms和-Xmx设置为相同的值
  • 每次JVM增加堆大小时,它都必须向操作系统申请额外的内存,这会有一定的时间开销。
  • 使用较小的堆大小,使得GC更加的频繁,如果从最开始就设置大一些,GC就不会那也频繁。
逃逸分析
虚拟机为什么要使用元空间替换永久代
  • 在之前方法区都是永久代来实现的
  • 从1.8开始,取消了永久代,改为元空间,换句话说方法区还在,只是实现变了,从永久代变成了元空间。
  • 在jdk1.8后,方法区存于元空间,物理内存不在于堆连续,而是直接存于本地内存中,理论上是(内存有多大、元空间就有多大)
  • 之所以要替换永久代:是为了避免OOM异常,因为设置了永久代的大小,当使用元空间时,可以加载多少类的元数据不再由MaxPermSize来控制,而由系统实际空间来控制。
调优命令有哪些
  • 堆栈内存相关
  • -Xms 设置初始堆的大小
  • -Xmx 设置最大堆的大小
  • -Xss 每个线程的堆栈大小
  • 垃圾收集器相关
  • -XX:+UseParallelGC:选择垃圾收集器为并行收集器。
  • -XX:ParallelGCThreads=20:配置并行收集器的线程数
  • -XX:+UseCMSCompactAtFullCollection 。可能会影响性能,但是
    可以消除碎片
  • 辅助信息
  • -XX:+PrintGCDetails 打印GC详细信息
  • -XX:+HeapDumpOnOutOfMemoryError让JVM在发生内存溢出的时候自动生成内存快照,排查问题用
  • -XX:+DisableExplicitGC禁止系统System.gc(),防止手动误触发FGC造成问题
JVM有哪些垃圾回收器
  • Serial收集器(复制算法):新生代单线程收集器,有点是简单高效
  • ParNew收集器(复制算法):新生代并行收集器,实际是Serial多线程收集器。
  • Parallel Scavenge(复制算法):新生代并行收集器,高吞吐,高效利用CPU。
  • Serial Old收集器(标记-整理):老年代单线程收集器。
  • Parallel Old收集器(标记-整理):老年代并行收集器
  • CMS(标记-清除):搞并发,低停顿。
  • G1(标记-整理):Java堆并行收集器,不会产生内存碎片。
  • ZGC:不设年龄分代,使用了读屏障,在JDK11中加入。
  • 新生代垃圾收集器:Serial、ParNew、Paral
  • 老年代垃圾收集器:CMS、Serial Old、Parallel Old
  • 整堆收集器:G1、ZGC
如何选择垃圾收集器
  • 如果堆不是特别大、且单核的机器、选择单线程收集器(参数: -XX:+UseSerialGC)
  • 如果吞吐量优先的,并且停顿时间没有要求的,可以选择并行收集器( -XX:+UseParallelGC)
  • 响应要求高、较少的停顿、基本上选择CMS、G1、ZGC(-XX:+UseZGC、-XX:+UseG1GC)
  • 使用并行收集器是一个不错的选择。

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值