JVM
JVM概述:
- 是什么-规范,有什么作用(多态,越界)
- Java为什么可以跨平台移植
- Java怎么做编译?与C语言的编译有什么区别?
- 比较: jvm jre jdk
- 整体的架构:
内存结构
-
内存结构/内存模型--即为运行时数据区:
- JVM了解过哪些版本,1.8和1.7内存结构不同的地方
- 堆中方法区(永久代实现)改为了放在本地内存的 方法区(元空间),堆中剩下年轻和老年代
- 内存结构是怎样的
- 哪些区域会出现OOM?
- JVM了解过哪些版本,1.8和1.7内存结构不同的地方
-
JVM内存
-
虚拟机栈:
-
虚拟机栈和本地方法栈的区别?
-
栈和栈帧的作用,属于什么
-
栈里有什么,栈帧的结构
-
是否要垃圾回收
-
OOM和StackOverflow是什么区别? OOM的可能
-
两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。 栈空间不足:java.lang.StackOverFlowError。 堆空间不足:java.lang.OutOfMemoryError。
-
-
本地方法栈存储的什么
- 有OOM
-
程序计数器:
- 特定,会OOM码
-
堆:
- 特点:
- 堆中有哪些对象:生成的Class对象存储在哪里。
- JAVA7中,堆内存的分区
- Java8中,方法区改为本地内存的元空间,避免OOM错误
-
方法区:
- 是什么,存了什么
- 字节码存储在哪个区域
- 常量池,运行时常量池,字符串常量池
- 常量池== 常量池表,查表。
- 字符串常量池:
- jdk 1.6之前StringTable是存在永久代中,属于运行时常量池一部分.
但是由于使用很频繁,且永久代中垃圾回收效率很低,所以为了优化.
jdk 1.7之后将StringTable移除到了堆内存中,堆内存中垃圾回收效率更高!
- jdk 1.6之前StringTable是存在永久代中,属于运行时常量池一部分.
- 是什么,存了什么
-
本地内存:
- 和虚拟机内存的区别:
- 直接内存:
-
变量的位置:
- private static final String 修饰的字符串对象在哪个区域
- 堆中,字符串常量池/static
- private static final String 修饰的字符串对象在哪个区域
-
内存管理:
-
内存的分配:
- 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中新生代和老年代的比例是动态的吗 ,比例是多少。你有去看过内存空间的设置吗。避免手动调节,自动分配。
- CMS的工作流程,使用场景,CMS简单说下哪些环节会有STW
- 怎么检测垃圾回收的状态呢?
-
内存泄漏
- jvm内存溢出和内存泄露的区别,分别有哪些场景?
- 虚拟机栈会内存溢出吗?堆会内存溢出吗?
- 几种情况:举例
- 如何避免内存泄漏,避免这几种情况?(在finally块释放资源)
- jvm内存溢出和内存泄露的区别,分别有哪些场景?
类加载:
-
对象访存:
- 实际大小:shallow heap和retained heap区别
-
什么是类加载:
-
类加载机制和过程:
- 连接的作用
-
类加载过程中,cinit方法如果执行失败了怎么办,这个类还能用吗?cinit方法能多次执行吗
-
类在初始化过程中,它的静态变量,静态方法块,成员变量,构造函数的执行步骤是什么
-
-
类加载器:
- 有哪些类加载器:作用
- 加载模型:
- 为什么要有双亲委派,那我先加载自己的类不行吗?
- 如何破坏双亲委派,自己写的重名类和内部类加载为啥报错
- 双亲委派模型可能比较耗时,如果我就想自己加载怎么办,其实就是想问如何打破双亲委派模型? 以通过自定义类加载器加载java.lang包下的类吗?
- 什么情况下需要自定义类加载器?怎样定义(完全不会)
运行机制:
- 字节码:
- 跨平台性
- class文件对应什么,类文件的结构:
系统优化:
-
性能调优:
-
JVM调优会不会:背景+思路+具体改动+验证方案,聊一次排查 JVM 的经历
-
了解过一些相关监测指令吗?
-
参数调优:在哪设置
- 常用的JVM参数:
- 最大堆和最小堆设置一样大,-Xms
和
-Xmx- 如果我设置了Xmx为1G,但是实际看Java进程用了1.3G,你觉得多出来的0.3G可能来自哪些部分。堆外内存,栈。
- Java申请的1g内存全部是真实的内存吗?
- 虚拟内存,堆和非堆
- 设置哪些分配内存参数
- 最大堆和最小堆设置一样大,-Xms
- 常用的JVM参数:
-
实际案例:
-
老年代一直满?然后让我分析可能是哪些原因。
-
当老年代(Old Generation)占用很满时,可能有以下几种原因:
内存泄漏(Memory Leaks):这是最常见的原因之一。如果应用程序中存在内存泄漏,就会导致对象无法被垃圾回收,最终导致老年代占用过多的内存空间。内存泄漏通常是由于对象被错误地引用或持有,导致它们无法被及时释放。 长时间存活的对象(Long-lived Objects):老年代主要用于存储长时间存活的对象。如果应用程序中存在大量长时间存活的对象,老年代的空间可能会很快被占满。 过大的对象(Large Objects):如果应用程序中创建了过大的对象,这些对象可能无法在新生代(Young Generation)中完全分配,而直接分配到老年代中。如果这些大对象过多,老年代的空间就会被快速占满。 GC调优不当:垃圾回收(Garbage Collection)算法和参数的选择对老年代的使用有很大影响。如果垃圾回收器的配置不合理或参数设置不当,可能导致老年代无法及时释放对象,从而造成占用过多的内存空间。
-
-
- 时间比较久的Minor GC
-
怎么排查,JVM工具
-
有没有遇到OOM的问题,内存区域哪些地方会OOM,如何解决OOM的
-
MetaSpace占用内存高一般是什么原因导致的?怎么排查?MetaSpace占用没有很多,但是发生Full GC是因为什么?
-
- new初始化过程,和反射相比谁更快?
-
了解过热点代码吗? 你知道hotsport为什么要叫hotspot?
-
JVM内存模型,如果一个项目中频繁大量创建寿命短的对象,如何优化JVM。
-
说说 JMM
标签:25,面试题,对象,虚拟机,回收,GC,内存,JVM,垃圾 From: https://www.cnblogs.com/Blunt-Raz0r/p/17704181.html