JVM面试题

JVM内存结构,主要组成部份和作用

1.类加载的系统classLoader
2.运行时数据区
3.执行引擎

一.类加载的系统classLoader

1.1类加载系统,是查找和验证.class文件,并成完成内存空间的分配和对象的赋值

二.运行时数据区

2.1运行时数据区,包括:本地方法区,堆区,栈区,程序计数器和本地方法栈

2.1.1 本地方法区的功能是去存储运行时的常量池,字段,和方法的一些元数据,类的元数据
本地方法区,负责加载并运行native方法

2.1.2堆区主要是存储java的对象实例,new的类都是存在堆区的。
堆区是通过线程的方式来运行,加载各种各样的方法
本地方法区和堆区属于线程共享内存区,编写代码可以操作的内存区

2.1.3程序计数器:负责保存每个线程执行方法的地址

2.1.4栈区,程序计数器还有本地方法栈,线程隔离内存区,完全由JVM调度

三.执行引擎

3.1执行引擎:包含即时编译器和垃圾回收器
即时编译器:将字节码翻译成cpu指令,然后我们通过JVM参数来设置它的一个执行方式
垃圾回收器:负责对运行时数据区的数据进行回收和管理,其次是对各种垃圾回收算法的实现

四.JVM中有哪些垃圾回收算法

标记清除算法,标记复制算法,标记整理算法

4.1 标记清除算法

标记出存活对象,没有标记的就是要回收的垃圾对象,垃圾回收线器就会回收没有被标记的对象
优点:
缺点:产生内存碎片,随着系统运行时间越长,无法分配大量连续空间,发生频繁的GC

4.2 标记复制算法

内存分为相等的两个部分,每次只使用其中一部份,使用的部份满了之后,标记出存活对象,存活对象复制到另一个闲置内存中,留在另一部份内存中的对象全部被垃圾回收器回收,闲置内存变成使用中状态,使用中变为闲置状态,循环工作
缺点:只有50%的内存可用,另外50%闲置,造成内存空间的浪费,大量复制,垃圾加收就会比较长,适合存活对象少,垃圾回收比较多的场景

4.3 标记整理算法

先标记出存活对象,存活对象整理到内存的另一端,没有被标记的对象就会被覆盖或释放掉
缺点:和标记清除算法本质差不多,多了一个动作,会把存活对象移到一起。
相比标记清除算法,从回收多了一个移动的动作,从回收效率来看,耗时会更久,新分配对象的耗时会下降

总结

java对象采用分代设计,分为年轻代,老年代,和永久代
年轻代采用标记复制算法,因为每次复制存活下来的对象会很少
老年代是经历过几次的GC的对象,采用标记清除算法,CMS回收器采用标记清除的方式,当内存碎片比较多的时候会触发标记整理算法,把内存碎片整理掉

五.JVM是如何通过标记确定对象是要回收的

JVM垃圾回收的时候,是通过一个可达性分析的一个算法,来确定对象是否可达,如果可达,对象就不能被回收,如果不可达,对象就可以被回收

5.1可达性分析的逻辑

jvm会从 gc root 开始,顺着这个对象的引用去查找对象,能被查找到的对象就是可达对象
gc root 具体包括类的静态属性,栈中的局部变量,常量引用,JNI发生的引用,这些都是GC ROOT的范畴

六.JVM调优

JVM参数分为三种:标准参数,X参数,XX参数
标准参数:主要用来查看一些信息,比如JVM版本号
X和XX参数用来设置内存参数,XX比X的稳定性会差一些
Xms:设置JVM启动的最小内存,默认是物理内存的1/64
Xmx:设置JVM的最大堆内存
Xms和Xmx一搬设置成相同大小,这样可以避免JVM自动内存扩容,内存扩容或发生内存抖动,且会有性能亏损,影响到服务稳定性。像现在的分布式开发,一台虚拟机上只部署一个应用,以8G内存为例,一搬会设置成6G或7G
Xmn:设置新生代内存大小,默认值n,表示new的意思 ,一搬设置堆空间的1/3或1/4
Xss:每个线程的虚拟机栈大小
Xx:新生代,老年代,永久代的比例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值