jvm的面试回答

1、jvm由本地方法栈、虚拟机栈、方法区、程序计数器、堆组成,其中堆和方法区是线程间共享的,程序计数器、虚拟机栈和本地方法栈是线程私有的。

2、虚拟机栈:

保存每个java方法的调用、保存局部变量表、等

栈可能出现内存溢出,如果出现调用方法死循环,会出现栈溢出,stackoverflow。

3、oom和stackOverflow

OOM是内存溢出,内存不足线程太多导致的。

stackoverflow是栈溢出,调用的方法太深了会这样,可能是调用出现了死循环。

4、本地方法栈

用于保存Java调用native方法的,native就是非java代码实现的方法。

5、堆

5.1 所有类的对象和数组分配内存的地方。

5.2 各个线程之间贡献

5.3 堆中放的是对象,栈帧中放的是对象的地址,也就是内存引用。

5.4 方法结束后,堆中的对象会等到垃圾回收时被移除。

5.5 堆中分为新生代和老年代

新生代分为eden和survivor(s0/from、s1/to)

新生代的gc叫young gc/minor gc

老年代的gc叫major gc/full gc

6、TLAB

thread local allocation buffer

堆中有一部分是用来放线程私有的,在eden区,线程本地分配缓存区。

那threadLocal放在堆里,threadLocal的key是弱引用,但是value不是,在使用完后需要remove,不然会引起内存泄漏。

7、方法区(线程共享)

7.1 存储了每个类的结构信息、类型信息、常量、静态变量等等。

7.2 运行时常量池放在方法区中

jdk7叫永久代,jdk8叫元空间

垃圾回收

会考,不好记
哪些可以作为GC ROOT
1、虚拟机栈中的对象引用
2、本地方法栈中的本地方法对象的引用
3、方法区中引用数据类型的静态变量
4、方法区中常量对象的引用
5、synchronized的对象引用

1、垃圾回收时的对象存活判断

1.1 引用计数法

每个对象保存一个引用计数器,记录对象被引用的次数

缺点是无法发现循环引用

1.2 可达性分析

以GC ROOT为起点,按照从上到下所有被连接的对象是否可达,没连接上的就会被回收。

GCRoot可以简单记成 虚拟机栈和方法栈 里对象的引用以及方法区静态变量和常量对象 的引用,或者是synchronized的对象引用

1、标记-清除算法

第一步标记,用根可达性分析,标记处被引用的对象

第二部清除,清除没有被标记的

缺点是会造成内存碎片,可用内存不连续。

2、复制算法

将内存分成两块,每次只使用其中一块,垃圾回收的时候把s0的存活对象复制到s1上,再清空s0。

3、标记-压缩算法

标记-清除-压缩:将存活的对象都移动到一块。

4、分代收集算法

是目前大部分jvm垃圾回收使用的算法,将内存分成老年代和新生代,老年代使用标记整理算法,新生代使用复制算法。

垃圾回收器

垃圾回收器

1.8默认的是 UseParallelGC

ParallelGC 默认的是 Parallel Scavenge(新生代)+ Parallel Old(老年代)

相关推荐
需要8264 分钟前
JVM 内存区域与对象创建:一次 GC 从哪来
java·jvm·spring boot·spring·servlet·tomcat
爱学习的执念31 分钟前
助力金九银十1000道软件测试面试题(功能、接口、自动化、WEB、APP.......)附答案
软件测试·面试
凤山老林31 分钟前
Spring Boot 应用 JVM 性能调优实战:GC 日志分析、堆内存规划与容器环境避坑
jvm·spring boot·gc·堆内存
小的~~39 分钟前
银河麒麟V10 ARM部署TDengine(涛思)工业时序数据库安装与测试
面试·程序员创富
2401_832298102 小时前
人机协同:AI时代全新工作与学习范式
职场和发展
童园管理札记2 小时前
从政策驱动到课堂落地:2026年“人工智能+教育”全景解读与技术实践指南
人工智能·python·深度学习·职场和发展·学习方法
小刘在重生~2 小时前
Oracle_day2 单行函数|组函数|分组|伪列|子查询|分页|多表连接
笔记·oracle·面试
Sam_Deep_Thinking2 小时前
关于java final关键字的可见性
java·后端·面试·程序员
yuanxi2004 小时前
卡塔尔能源公司LNG扩建项目首条生产线预计明年投运:大客户销售的5个判断
职场和发展·创业创新·学习方法
Rain的Java大神之路14 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试