25届实习秋招-Java面试-JVM虚拟机常见知识点

JVM

JVM概述:

内存结构

  • 内存结构/内存模型--即为运行时数据区:

    • JVM了解过哪些版本,1.8和1.7内存结构不同的地方
      • 方法区规范(8之前永久代实现堆上)改为了放在本地内存的 方法区(元空间实现),堆中剩下年轻和老年代,字符串常量池、静态变量
    • 内存结构是怎样
  • JVM内存

    • 程序计数器:

      • 特定
    • 虚拟机栈:

    • 本地方法栈存储的什么

      • 虚拟机栈和本地方法栈的区别?
    • 堆:

      • 特点
      • 堆中有哪些对象
        • 生成的Class对象存储在哪里
      • Java8中方法区改为本地内存的元空间
      • 堆内存工具,三个
    • 方法区(元空间):

      • 存了什么
        • 字节码存储在哪个区域
      • 类(静态)常量池,运行时常量池,字符串常量池
        • 常量池== 常量池表,查表。
        • 字符串常量池(StringTable):
          • jdk 1.6之前StringTable是存在永久代中,属于运行时常量池一部分。但是由于使用很频繁,且永久代中垃圾回收效率很低。jdk 1.7之后将StringTable移除到了堆内存中,堆内存中垃圾回收效率更高。
        • 什么是常量,什么是变量。为什么要常量池
    • 本地内存:

      • 和虚拟机内存的区别
      • 中的直接内存
    • 变量的位置:

      • private static final String 在哪个区域 --方法区

内存管理:

  • 内存的分配:(结合javanote)

    • TLAB简单了解一下
    • 逃逸分析:
      • 对象只能在堆上分配吗?如果在栈上分配除了逃逸分析外,还要有什么条件?
    • 分代思想:
      • 新生代和老年代,比例划分
        • 新生代又分为什么
      • MinorGC(YoungGC)和Full GC
      • 晋升到老年代的条件:
        • 阈值是几,大对象
        • 大对象为什么不放在新生代
        • 对象晋升是什么, 过早晋升会导致哪些危害
  • 回收策略:

    • 各种GC什么时候触发:

      • MinorGC的触发时机是什么,触发STW

      • 什么时候会FullGC

        • 如何手动GC,担保
      • 如何避免FullGC

      • MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW) Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有 FullGC: 新生代 + 老年代完整垃圾回收+方法区,暂停时间长(STW),应尽力避免
    • 这两个GC的流程

    • GC的过程是由谁来调度和启动的

  • 垃圾回收:

    • 垃圾判断:

      • 要对哪些进行垃圾回收(主要是堆中对象,部分方法区中)
      • 判断对象存活(是否是)的两种方式:引用计数算法可达性分析算法
        • 引用计数法:
          • 优点:循环引用问题
        • 可达性算法:
          • 什么是GCroots(引用),如何选gcroots(说全)
          • 应该有哪些前置性的操作
            • STW
          • 可达性算法底层数据结构
          • 三色标记原理
          • 并发标记:多标-浮动垃圾,漏标的处理了解。
        • 引用分析:
          • java的四大引用类型,引用队列
    • 回收算法:

    • 垃圾回收器:

      • 1.8之前分代上下结合,不同的分代有不同的垃圾回收器,举出不同分代常用垃圾回收器

        • 红色虚线在 JDK9 移除、绿色虚线在 JDK14 弃用该组合、青色虚线在 JDK14 删除 CMS 垃圾回收器
        • 之后就是分区,所有代只一个回收器
      • 回收算法的具体实现:分为哪几类:

        • 哪些是并行的-为什么要并行,GC的性能指标
        • 卡表记忆集--了解,漏标写屏障-了解,跨代引用问题
        • 常见的垃圾回收器组合,组合中使用的回收算法
          • JDK各个版本使用的哪个垃圾回收器,jdk8
          • 并行和并发的区别,STW
          • CMS的工作流程,使用场景(用在哪一代)
            • 和之前的区别,分为几步,哪步会STW
            • 浮动垃圾和错标
            • 为什么要STW,CMS为什么标记清除
        • G1的工作流程,和CMS区别,优缺点
          • g1有分代(区域吗),g1里除了新老生代,还新增了哪个区(大对象区)
          • 浮动垃圾有解决吗,一定程度解决了(还有)|| 内存碎片呢
          • CMS和G1如何选择。
          • G1中新生代和老年代的比例是动态的吗 ,比例是多少,可以手动设置,会扩容有上限。避免手动调节,自动分配 。
  • 调优见下面

类加载-编译

  • 了解过热点代码吗? 你知道hotsport为什么要叫hotspot?

  • 什么是类加载:

    • 类文件的结构,javap反编译:了解

    • 多态的原理,synchrondized的原理

  • 语法糖,了解

  • 类加载机制和过程:

    • 加载阶段加载了哪两个。
    • 连接的作用
    • clinit执行几次,如果执行失败了怎么办这个类还能用吗?
      • clinit()和单例模式
    • InstanceKlass,Class类对象(作用--java_mirror),实例对象之间的关系
      • 静态变量存哪
    • 静态变量,静态代码块,成员变量,构造函数的执行先后顺序
    • 什么操作会触发初始化,初始化和类加载的关系
  • 类加载器:


运行期优化:了解

  • 热点代码,逃逸分析-作用

JMM内存模型

  • JMM描述的是什么
  • 其他在JUC内存部分

系统优化:

  • 性能调优:

  • JVM调优会不会:背景+思路+具体改动+验证方案,聊一次排查 JVM 的经历

  • 了解过一些相关监测指令吗?

  • 内存泄漏

  • 参数调优:

    • 在哪设置
    • 常用的JVM参数:
      • 最大堆和堆初始大小设置
        • Xmx和实际占用的内存大小,Xmx和xms的关系
          • Java申请的1g内存全部是真实的内存吗
      • 说出常用参数
  • 实际案例:

    • GC调优目标,相关工具,怎么看到参数。

    • 老年代一直满?然后让我分析可能是哪些原因。

      • log4j2导致内存泄露: 记住用的工具,如jps

        • 大对象直接进入老年代因此频繁 Full GC 静态变量过多,变量生命周期过长,存活率过高,造成老年代过大; 内存泄露导致无用对象晋升老年代并无法被 GC 回收。
        • 内存泄漏怎么诊断:

          • 答了jmap、jvm参数堆转内存快照放到visual jvm中,会提示oom的位置。面试官说生产环境中不会等到宕机再看,在没宕机出现oom的时候可以看一下有哪些大对象或者长期未被回收的对象。
    • MetaSpace占用内存高一般是什么原因导致的


__EOF__

本文作者userName
本文链接https://www.cnblogs.com/Blunt-Raz0r/p/17704181.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Blunt-Razor  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示