25届实习秋招-Java面试-JVM虚拟机常见知识点
JVM
JVM概述:
- 是什么-规范,有什么作用
- jvm jre jdk
- 整体的架构:
内存结构
-
内存结构/内存模型--即为运行时数据区:
- JVM了解过哪些版本,1.8和1.7内存结构不同的地方
- 方法区规范(8之前永久代实现堆上)改为了放在本地内存的 方法区(元空间实现),堆中剩下年轻和老年代,字符串常量池、静态变量
- 内存结构是怎样
- JVM了解过哪些版本,1.8和1.7内存结构不同的地方
-
JVM内存
-
程序计数器:
- 特定
-
虚拟机栈:
- 栈和栈帧的作用
- 栈里有什么,栈帧的结构
- 是否要垃圾回收
- OOM和StackOverflow是什么区别?
- OOM的可能,Java出现了OOM怎么排查
- 哪些区域会出现OOM?,程序计数器呢
- 有没有遇到OOM的问题,如何解决OOM的
- 分为堆和栈,异常类型
-
本地方法栈存储的什么
- 虚拟机栈和本地方法栈的区别?
-
堆:
- 特点
- 堆中有哪些对象
- 生成的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
-
-
-
这两个GC的流程
-
GC的过程是由谁来调度和启动的
-
-
垃圾回收:
-
垃圾判断:
- 要对哪些进行垃圾回收(主要是堆中对象,部分方法区中)
- 判断对象存活(是否是)的两种方式:引用计数算法和可达性分析算法
- 引用计数法:
- 优点:循环引用问题
- 可达性算法:
- 什么是GCroots(引用),如何选gcroots(说全)
- 应该有哪些前置性的操作
- STW
- 可达性算法底层数据结构
- 三色标记原理
- 并发标记:多标-浮动垃圾,漏标的处理了解。
- 引用分析:
- java的四大引用类型,引用队列
- 引用计数法:
-
回收算法:
- [大总结](Java 垃圾回收机制 - 迷路的圆 - 博客园 (cnblogs.com))
- 三种区别,优缺点,用在哪里:
- 分配担保机制,具体的回收要依赖回收算法
- JVM综合使用了上述算法,实现了分代垃圾回收机制
-
垃圾回收器:
-
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),实例对象之间的关系
- 静态变量存哪
- 静态变量,静态代码块,成员变量,构造函数的执行先后顺序
- 什么操作会触发初始化,初始化和类加载的关系
-
类加载器:
-
有哪些类加载器:作用
-
加载模型:
-
三种类加载器:加载的目录,如何获取类加载器。
- jre/lib
-
为什么要有双亲委派,目的是什么,缺点
- 【Java】深入了解双亲委派机制(常说的类加载机制)_spring 双亲委派-CSDN博客
- 如何破坏双亲委派,为什么自定义类加载器,自己写的类和String类重名加载为啥报错
- 自定义类加载器可以加载java.lang包下的类吗-jvm安全检查
- 什么情况下需要自定义类加载器
-
线程类加载了解
-
-
运行期优化:了解
- 热点代码,逃逸分析-作用
JMM内存模型
- JMM描述的是什么
- 其他在JUC内存部分
系统优化:
-
性能调优:
-
JVM调优会不会:背景+思路+具体改动+验证方案,聊一次排查 JVM 的经历
-
了解过一些相关监测指令吗?
-
内存泄漏
- jvm内存溢出和内存泄露的区别,分别有哪些场景
- 内存泄漏的8种情况:
- 如何避免这几种情况
-
参数调优:
- 在哪设置
- 常用的JVM参数:
- 最大堆和堆初始大小设置
- Xmx和实际占用的内存大小,Xmx和xms的关系
- Java申请的1g内存全部是真实的内存吗
- Xmx和实际占用的内存大小,Xmx和xms的关系
- 说出常用参数
- 最大堆和堆初始大小设置
-
实际案例:
-
GC调优目标,相关工具,怎么看到参数。
- 调优的步骤,为什么这么做
- 新生代
-
新生代设置比例,为什么要折中
-
怎么优化
-
- 工具:jstat
-
时间比较久的Minor GC
-
- 新生代
- 调优的步骤,为什么这么做
-
老年代一直满?然后让我分析可能是哪些原因。
-
log4j2导致内存泄露: 记住用的工具,如jps
-
-
内存泄漏怎么诊断:
- 答了jmap、jvm参数堆转内存快照放到visual jvm中,会提示oom的位置。面试官说生产环境中不会等到宕机再看,在没宕机出现oom的时候可以看一下有哪些大对象或者长期未被回收的对象。
-
-
-
MetaSpace占用内存高一般是什么原因导致的
- 原理, 流程
-
__EOF__

本文作者:userName
本文链接:https://www.cnblogs.com/Blunt-Raz0r/p/17704181.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Blunt-Raz0r/p/17704181.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~