栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM 常见面试题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM 常见面试题

JVM: JVM 内存新生代中为什么要分为 eden 和 survivor:

如果没有 survivor,那么Eden 每次 GC 后存活的对象就会进入老年代,老年代就会很快满了,触发 FULL GC 消耗的时间要长很多,所以要分为 Eden 和 Survivor ,只有经历 15 次以后,依旧存活的对象才会进入老年代,同时避免了碎片化的发生,(保证 s0 和 eden 两部分的存活对象占用连续的内存空间,从而避免碎片化)

元空间和永久代的区别:

在 java8 中,永久代已经被移除,被元空间给取代,元空间的本质和永久代类似,元空间与永久代之间最大的区别在于,元空间并不在虚拟机中,而是使用本地内存,所以默认的元空间受本地内存的限制

说一下 CMS 和 G1 收集器:

CMS 是多线程标记清除算法

主要目标是获取最短垃圾回收停顿时间,分为四个阶段:初始标记、并发标记、重新标记、并发清除

G1 收集器最突出的改进是:

1、基于标记-整理算法,不产生内存碎片

2、可以精准地控制停顿时间,确保能在有限的时间内,获得最高的垃圾收集效率

JVM 性能调优:

-Xms:堆内存大小限制

-XX:NewSize 新生代大小

-XX:NewRatio 新生代和老年代占比

JVM 的位置

运行在操作系统之上

. java 文件通过 javac 命令编译成 .class 文件,然后通过 类加载器 加载到 JVM 中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3ybCz4P-1641975332811)(C:Users62459AppDataRoamingTyporatypora-user-imagesimage-20220111155321776.png)]

本地方法栈,java 栈,程序计数器中没有垃圾回收机制,JVM 调优,多数情况就是在调 堆

类加载器:

虚拟机自带的加载器

根加载器

拓展加载器

应用程序加载器

作用:加载 class 文件

沙箱安全机制: 字节码校验器:

确保 java 类文件遵循 java 语言规范,可以帮助 java 程序实现内存保护。

类装载器:

防止恶意代码干涉善意代码(双亲委派机制)

守护了被信任的类库边界

将代码归入保护域,确定了代码可以进行哪些操作

双亲委派机制:

1、类加载器收到类加载的请求

2、将这个请求委托给父类加载器去完成,一直向上委托,直到启动类加载起

3、启动加载器检查是否能加载当前类,能加载使用,否则抛出异常,通知子加载器进行加载

4、重复

都加载不了,就报异常:classNotFoundExcepion

在运行前,需要向上找,最终执行根加载器的 jar 包

app -> ext -> boot 深搜到 boot 然后寻找 jar 包, 如果找到直接使用,如果找不到就去 ext,同理 app

native 关键字

new Thread start 执行以后,执行 native 修饰的 start0 方法

凡是 native 修饰的方法,说明 java 的作用达不到了,会进入本地方法栈,通过本地方法接口,调用本地的 C 语言库

PC 寄存器:

程序计数器,每一个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码,占用非常小的内存空间

方法区:

方法区是被所有线程共享的,是共享区间

静态变量,常量,类信息(构造方法,接口定义)、运行时的常量池存放在方法区中

static final Class 运行时常量池

但是 实例变量 存放在堆内存中,与方法区无关

栈:

栈:主管程序的运行,生命周期和线程同步,栈中没有垃圾回收,一旦栈空了,程序就执行完毕了。

栈中存储:八大基本类型 + 对象引用 + 实例的方法

堆:

一个 JVM 只有一个堆内存,堆内存的大小是可以调整的

堆内存的三个区域:

新生代

所有的对象都是从伊甸园区 new 出来的

有百分之九十九的对象都是临时对象

老年代 元空间(常驻内存,存放 jdk 自身携带的 class 对象)

不存在垃圾回收,关闭 VM 虚拟机就会释放这个区域的内存

存放常量池

GC 垃圾回收主要在新生代和老年代

堆内存移除:OOM,OutOfMemoryError 无限增加字符串长度

在 jdk8 以后,永久代被元空间代替

出现 OOM 的解决方法:

首先判断是否是代码自身有问题,是否存在字符串无限扩大等情况,如果没有,手动修改堆内存空间

Xms 设置初始化内存分配大小,默认 1 / 64

Xmx 设置最大分配内存,默认 1/4

-XX:+ PrintGCDetails 打印 GC 垃圾回收信息

Jprofiler 作用:

分析 dump 内存文件,快速定位内存泄漏

获得堆中的数据

获得大的对象

GC:

作用区域只存在堆和方法区

分为两种:轻 GC,重 GC

当某个对象经历了十五次 GC 还存活时,会进入老年区(默认十五次)

伊甸园区,幸存者区存活率低,主要是用 复制算法

老年代,区域大,因此使用 标记清除 + 标记压缩混合实现

JMM:(Java Memory Model) -> 并发问题

是一种缓存一致性协议,用于定义数据读写的规则

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704492.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号