25届实习秋招-Java面试-JVM虚拟机面试题整理-牛客网

JVM

JVM概述:

  • 是什么-规范,有什么作用(多态,越界)
    • Java为什么可以跨平台移植
    • Java怎么做编译?与C语言的编译有什么区别?
  • 比较: jvm jre jdk
  • 整体的架构:

内存结构

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

    • JVM了解过哪些版本,1.8和1.7内存结构不同的地方
      • 堆中方法区(永久代实现)改为了放在本地内存的 方法区(元空间),堆中剩下年轻和老年代
    • 内存结构是怎样的
    • 哪些区域会出现OOM?
  • JVM内存

    • 虚拟机栈:

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

      • 栈和栈帧的作用,属于什么

      • 栈里有什么,栈帧的结构

      • 是否要垃圾回收

      • OOM和StackOverflow是什么区别? OOM的可能

      • 两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。
             栈空间不足:java.lang.StackOverFlowError。
             堆空间不足:java.lang.OutOfMemoryError。
        
    • 本地方法栈存储的什么

      • 有OOM
    • 程序计数器:

      • 特定,会OOM码
    • 堆:

      • 特点:
      • 堆中有哪些对象:生成的Class对象存储在哪里。
      • JAVA7中,堆内存的分区
      • Java8中,方法区改为本地内存的元空间,避免OOM错误
    • 方法区:

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

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

      • private static final String 修饰的字符串对象在哪个区域
        • 堆中,字符串常量池/static

内存管理:

  • 内存的分配:

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

    • 各种GC什么时候触发:

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

      • 什么时候会FUll GC

      • 如何手动GC

      • 如何避免FUll GC

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

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

  • 垃圾判断:

    • 什么是垃圾:
    • 要堆哪些进行垃圾回收
    • 判断对象存活一般有两种方式:引用计数算法可达性分析算法
      • 引用计数法:
        • 优点:循环引用问题
      • 可达性算法:
        • 什么是GC roots
        • 如何选择gcroots(本地方法对象、静态对象,常量对象,被锁住的对象–说全了) 类加载器可以作为GC root吗
        • 应该有哪些前置性的操作
        • 可达性算法底层数据结构
        • 三色标记原理
          • 为什么会有垃圾碎片的产生:
          • 漏标的处理,了解。
      • 引用分析:
        • java的四大引用类型
  • 回收算法:

    • 三种区别,优缺点,用在哪里:具体的回收要依赖回收算法
    • JVM综合使用了上述算法,实现了分代垃圾回收机制
  • 垃圾回收器:

    • JDK各个版本使用的哪个垃圾回收器
    • 是回收算法的具体实现:分为哪几类:
      • CMS的工作流程,使用场景,CMS简单说下哪些环节会有STW
        • 清除,
      • G1的工作流程,和CMS区别,优缺点
        • g1有分区嘛,g1里除了新老生代,还新增了哪个区
        • 浮动垃圾有解决吗?浮动垃圾的后果。
        • CMS和G1如何选择。
        • G1中新生代和老年代的比例是动态的吗 ,比例是多少。你有去看过内存空间的设置吗。避免手动调节,自动分配。
    • 怎么检测垃圾回收的状态呢?
  • 内存泄漏

    • jvm内存溢出和内存泄露的区别,分别有哪些场景?
      • 虚拟机栈会内存溢出吗?堆会内存溢出吗?
    • 几种情况:举例
      • 如何避免内存泄漏,避免这几种情况?(在finally块释放资源)

类加载:

  • 对象访存:

    • 实际大小:shallow heap和retained heap区别
  • 什么是类加载:

    • 类加载机制和过程:

      • 连接的作用
    • 类加载过程中,cinit方法如果执行失败了怎么办,这个类还能用吗?cinit方法能多次执行吗

    • 类在初始化过程中,它的静态变量,静态方法块,成员变量,构造函数的执行步骤是什么

  • 类加载器:

    • 有哪些类加载器:作用
    • 加载模型:
      • 为什么要有双亲委派,那我先加载自己的类不行吗?
      • 如何破坏双亲委派,自己写的重名类和内部类加载为啥报错
      • 双亲委派模型可能比较耗时,如果我就想自己加载怎么办,其实就是想问如何打破双亲委派模型? 以通过自定义类加载器加载java.lang包下的类吗?
      • 什么情况下需要自定义类加载器?怎样定义(完全不会)

运行机制:

  • 字节码:
    • 跨平台性
    • class文件对应什么,类文件的结构:

系统优化:

  • 性能调优:

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

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

  • 参数调优:在哪设置

    • 常用的JVM参数:
      • 最大堆和最小堆设置一样大,-Xms-Xmx
        • 如果我设置了Xmx为1G,但是实际看Java进程用了1.3G,你觉得多出来的0.3G可能来自哪些部分。堆外内存,栈。
        • Java申请的1g内存全部是真实的内存吗?
          • 虚拟内存,堆和非堆
      • 设置哪些分配内存参数
  • 实际案例:

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

      • 当老年代(Old Generation)占用很满时,可能有以下几种原因:

        内存泄漏(Memory Leaks):这是最常见的原因之一。如果应用程序中存在内存泄漏,就会导致对象无法被垃圾回收,最终导致老年代占用过多的内存空间。内存泄漏通常是由于对象被错误地引用或持有,导致它们无法被及时释放。
        长时间存活的对象(Long-lived Objects):老年代主要用于存储长时间存活的对象。如果应用程序中存在大量长时间存活的对象,老年代的空间可能会很快被占满。
        过大的对象(Large Objects):如果应用程序中创建了过大的对象,这些对象可能无法在新生代(Young Generation)中完全分配,而直接分配到老年代中。如果这些大对象过多,老年代的空间就会被快速占满。
        GC调优不当:垃圾回收(Garbage Collection)算法和参数的选择对老年代的使用有很大影响。如果垃圾回收器的配置不合理或参数设置不当,可能导致老年代无法及时释放对象,从而造成占用过多的内存空间。
        
    • 频繁发生minor GC

      • 时间比较久的Minor GC
    • Full GC次数过多。

    • YGC导致CPU负载过高的排查与解决

    • 怎么排查,JVM工具

    • 有没有遇到OOM的问题,内存区域哪些地方会OOM,如何解决OOM的

    • MetaSpace占用内存高一般是什么原因导致的?怎么排查?MetaSpace占用没有很多,但是发生Full GC是因为什么?

    • Java对象创建的流程步骤

      • new初始化过程,和反射相比谁更快?
    • 了解过热点代码吗? 你知道hotsport为什么要叫hotspot?

    • JVM内存模型,如果一个项目中频繁大量创建寿命短的对象,如何优化JVM。

说说 JMM

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值