JAVA面试题合集八(虚拟机JVM)

1.说一下JVM的主要组成部分及作用?
在这里插入图片描述
JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);
两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。
Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method
area。
Execution engine(执行引擎):执行classes中的指令。
Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。
Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。
在这里插入图片描述
2.java程序运行机制说明?
Java程序运行机制步骤
首先利用IDE集成开发工具编写Java源代码,源文件的后缀为.java;
再利用编译器(javac命令)将源代码编译成字节码文件,字节码文件的后缀名为.class;
运行字节码的工作是由解释器(java命令)来完成的。
在这里插入图片描述
从上图可以看,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。
其实可以一句话来解释:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
3.说一下JVM运行时数据区?
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。
在这里插入图片描述
4.深拷贝和浅拷贝?
浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。
5.说一下堆栈的区别?
物理地址:
堆:堆的物理地址分配对象是不连续的.,性能慢,GC也要考虑不连续的分配,所以有各种算法。比如,标记-消除,复制,标记-压缩,分代
(即新生代使用复制算法,老年代使用标记——压缩
栈:先进后出,物理地址分配是连续的,所以性能较快

内存分配
堆不连续的,所以分配的内存是在运行期确认,因此大小不固定.,堆大小远大于栈
栈:连续的,在编译期就确认.大小固定

存放内容
堆存放对象的实例和数组,更加关注数据存储
栈:存放局部变量.更加关注程序方法的执行.

静态变量存放在方法区
静态对象存放在堆中
堆整个应用程序共享.
栈仅对线程可见,私有的. 它的生命周期和线程相同
6.队列和栈是什么?有什么区别?
队列和栈都是被用来预存储数据的。
操作的名称不同。
队列的插入称为入队,队列的删除称为出队。栈的插入称为进栈,栈的删除称为出栈。
可操作的方式不同。队列是在队尾入队,队头出队,即两边都可操作。 先进先出
而栈的进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作。

操作的方法不同。
队列是先进先出(FIFO),即队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(不能从中间插入),每次离开的成员总是队列头上(不允许中途离队)。
而栈为后进先出(LIFO),即每次删除(出栈)的总是当前栈中最新的元素,即最后插入(进栈)的元素,而最先插入的被放在栈的底部要
到最后才能删除。
7.HotSpot虚拟机对象
在这里插入图片描述

JVAV中提供了几种创建对象的方式?
new关键字 调用构造函数
Class.newInstance()方法 调用构造函数
使用Constructor的newInstance()方法 调用构造函数
使用clone()方法 没有调用构造函数
使用序列化 没有调用构造函数
8. 对象的创建主要流程?
当虚拟机遇到一条new指令时,首先会检查常量池中是否已经加载过该类, 如果没有加载过,则必须先执行相应的类加载,类加载通过后,然后再分配内存,若java中堆内存分配是绝对完整的,使用"指针碰撞"来分配内存,若不是完整的,则从"空闲列表"中分配内存.划分内存,还要考虑到"并发" ,CAS同步处理.或者是本地线程分配缓冲,然后内存空间初始化操作.

CAS机制中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。
更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。
9.JAVA会存在内存泄漏吗?
内存泄漏是指不再使用的对象或者变量一直被占用在内存中, JAVA中GC垃圾回收机制.,也就是说,不再使用的对象会被GC自动回收掉,从内存中清除,.JAVA导致内存泄漏的原因很明确. 长生命周期的对象会有短生命周期对象的引用,尽管短生命周期对象已经不再需要了.但是还有长生命周期对象的引用指向它而不能回收,这就是内存泄漏.
10.简述垃圾回收机制?
在java中,.不需要程序员自己显示的去释放一个对象的内存,而是由虚拟机自己执行,JVM中有一个垃圾回收线程.低优先级的,只有当堆内存不足或者是虚拟机空闲时,触发执行.扫描那些没有被任何引用的对象,并添加到垃圾级回收的集合中,进行回收.
11.垃圾回收机制的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么方法能通知虚拟机进行垃圾回收?
对于GC来说,当创建对象时,会监控这个对象的内存地址.,大小使用情况.GC管理堆heap中所有对象,来确定哪些对象是可达的,哪些对象是不可达的,当GC确定哪些对象是不可达时,便会GC自动回收这些内存空间.可以手动执行System.GC() 通知GC执行.但是JAVA语言规范.,不一定会保证GC一定执行.
12.JAVA中都有哪些引用类型?
强引用: 发生GC的时候,不会自动回收
软引用 有用,但不是必须的对象.在发生内存溢出之前,会被回收
弱引用 有用但不是必须的对象,再发生下一次GC之前,会被回收.
虚引用 无法通过虚引用获得对象.虚引用的用途在GC时返回一个通知.
13.怎样判断对象是否可以被回收?
垃圾收集器,在进行垃圾回收的时候.首先要判断哪些内存是可以被回收的,哪些对象是存活的.是不可以回收的.哪些对象是死掉的,是不可以被回收的.
一般通过2种方法判断
引用计数器法 :为每个对象创建一个引用计数,有对象引用时,计数器加1,引用被释放,计数器减1,当为0时,则可以被回收,不能解决循环引用的问题.
可达性分析算法:从GC Roots开始向下搜索,搜索走过的路径称为引用链.当一个对象到GC Roots时,没有任何引用链相连时,则证明此对象是可以被回收的,
14.在JAVA中,对象什么时候可以被垃圾回收?
当对象使用当前这个对象变的应用程序变得不可触及时,这个对象就可以被回收了.
15.JVM 的永久代会触发垃圾回收吗?
垃圾回收不会发生在永久代,如果永久代满了,超过临界值,会触发垃圾回收,JAVA8已经移出了永久代,新加了一个叫元数据区的native区
16.说一下JVM都有哪些垃圾回收算法?
标记-清除算法—标记无用的对象,然后进行垃圾回收.
标记:标记清除的对象 清除:回收被标记的对象所占用的内存
优点:操作简单,不需要对象进行移动 缺点: 标记清除效率低,产生大量不连续的内存碎片.提高了垃圾回收的频率.

复制算法: 把内存空间分为两个区域,每次只使用一个区域.把存活对象复制到另一个区域中.最后将当前使用的区域的可回收的对象回收
优点::顺序分配.使用简单,没有内存碎片. 缺点:可用内存会分为原来的一半,存活率高的对象频繁的复制,

标记-整理算法 :新生代使用复制,老年代存活率高,不能使用复制算法,.
标记清理 适合老年大,与标记-整理算法不同的是,在标记可回收的对象后将所有存活的对象压缩到内存的一端,使他们紧凑的排列在一起,然后对端边界以外的内存进行回收。回收后,已用和未用的内存都各自一边。
优点:解决了标记-清理算法存在的内存碎片问题。
缺点:仍需要进行局部对象移动,一定程度上降低了效率

分代算法:根据对象的存活周期.将内存划分为几块,一般包括,年轻代,老年代,永久代,
17.说一下JVM都有哪些垃圾回收器?
新生代 3种,复制算法
老年代 4种,.标记整理算法.标记-清除算法
18. 大对象, 长期存活的对象进入老年代在这里插入图片描述
19.简述JAVA类加载机制?
虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型.
20.请描述一下JVM加载Clas文件的原理机制?
JAVA中的所有类,都需要由类加载类装载到JVM中才能运行,类加载器本身也是一个类,而它的工作是把class文件从硬盘读取到内存中.在写程序的时候,无需关心类的加载,因为这些都是隐式加载.
隐式装载 new方式创建对象.隐式调用类装载器加载对应的类到JVM中
显示装载 Class.forName() 显示加载所需要的类

JAVA 的类加载是动态的.先把基础类加载(基类)完全加载到JVM中.至于 其他类需要的时候再加载.节省了内存开销.
21.什么是类加载器?类加载器都有哪些?

类加载器: 实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器

类加载器就是根据指定全限定名称将 class 文件加载到JVM 内存,然后再转化为 class 对象
在这里插入图片描述
在这里插入图片描述
22.在这里插入图片描述
23. 什么是双亲委派模型?
在这里插入图片描述
自定义来加载器—>应用程序类加载器—>扩展类加载器—>启动类加载器
在这里插入图片描述
当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。
24.说一下JVM的调优工具?
在这里插入图片描述
25.常用的JVM调优参数都有哪些?
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值