Java面试之JVM

Java面试之JVM,第1张

本章主要记录一些jvm相关的面试题目,平时对这方面不太注重,也是边学边记

内存区域
  1. 说一下 JVM 的主要组成部分及其作用?类加载器,运行时数据区,本地库接口,执行引擎;运行时执行顺序是java文件编译后变为class字节码,然后类加载器将其放进jvm中,在jvm中,堆内存内创建一个java.lang.class对象,类封装在其中
  2. 说一下 JVM 运行时数据区
    一个堆两个栈一个区一个程序计数器,
    java堆:各个线程共享,几乎所有变量实例都在这里分配内存;
    java虚拟机栈:虚拟机用来存储局部变量表, *** 作数栈,动态链接,方法出口灯;
    本地方法栈:虚拟机调用本地方法栈
    方法区:存储一些类的信息,编译后的代码
    程序计数器:行号,一些程序执行时的代码顺序
  3. 深拷贝和浅拷贝
    深浅拷贝,或者复制,其区别就在于是否开辟新的内存区域,浅拷贝就只是新建一个指向旧内存区域的指针,深拷贝就建立了新的内存区域,这样的好处在于删去内存区域时不会产生别的指针错误
  4. 说一下堆栈的区别?
    物理地址:堆不连续而栈连续
    内存区域:堆在运行时动态确认内存大小,栈需要在编译时就确认,栈小于堆
    存放内容:堆一般是变量,数组一类数据存储,栈是 *** 作数,对象,返回结果一类,这些东西连续,偏运行
    可见性:堆对整体可见,栈对单个线程可见,生命周期与线程同步
  5. 队列和栈是什么?有什么区别?
    这两个都类似数据结构里的队列和栈,队列是先进先出,可以在头尾 *** 作,栈是先进后出,只能在栈顶 *** 作
  6. Java 中提供的几种对象创建方式,创建流程
    使用new,class的newInstance方法以及constructot的newInstance方法,这三种调用构造器;而反序列化和clone不调构造器
    创建流程:首先检查类是否加载,然后检查内存是否规整,然后检查并发问题,最后初始化,设置对象信息, 执行init
    7.为对象分配内存的两种方式
    内存碰撞:如果内存规整,就按照对象大小在其后划分一段供使用
    空闲列表:内存不规则,虚拟机用一个列表记录内存使用情况,查询划分给对象
  7. 处理并发安全问题的方式
    CAS同步和本地线程分配缓冲
    所谓并发安全,主要就出现在两个对象分配内存中的冲突一类的错误,而解决办法就是同步或者上锁
    第一种就是cas和失败重试进行同步,保证原子性,第二种就是tlab(方法缩写),每个线程分配时在一块预先给的tlab内存里进行,如果用完后需要分配一块新的tlab,就上同步锁
  8. 对象的访问定位方式
    两种方法,
    句柄,句柄指向指针,指针指向对象内存,就算对象地址移动,也不需要移动句柄
    直接指针,直接指向对象地址,如果移动就需要重分配这些指针,优势在于速度快
  9. Java会存在内存泄漏吗?请简单描述
    通常gc就会对内存泄露进行处理,也就是对象生命周期已经结束后由gc回收,但如果别的还没结束的对象引用了一个已经结束的对象,那就因为短引用被长持有而无法回收短,也就是内存泄露
  10. 简述Java垃圾回收机制,为什么要gc
    java内,一般不需手动回收内存,gc垃圾回收一般是在空间不足且虚拟机空闲时,去扫描那些已经不使用的内存进行释放,因为开发人员可能会遗忘释放内存 *** 作,或者手动释放出现冲突,所以由java自动gc
  11. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法
    主动通知虚拟机进行垃圾回收
    创建对象后,gc就开始监控,一般使用有向图,对那些不可达的,就执行回收,system类里有gc方法,但未必会执行
  12. Java 中都有哪些引用类型?
    强软弱虚引用四种,分别是不会被gc,内存不足时gc,下次gc,给gc返回一个消息
  13. 怎么判断对象是否可以被回收?
    计数器法,初始是0,引用一个加一,删一个减一,是0就可以回收
    引用链法,从root往下找,若找到一个没有一个指向它的节点,就判断可以gc
  14. JVM中的永久代中会发生垃圾回收吗,一般不会,但超过永久代大小时,会进行完全垃圾回收,需要设置合适的永久代大小,但java8已经用本地数据区代替了永久代
  15. 说一下 JVM 有哪些垃圾回收算法
    标记清除:标记出无用的然后清除,缺点是会产生内存碎片
    复制:内存均分两块,一块存,一块空闲,要gc时直接把有用的搬到另一块,原来的全删
    标记整理:将有用的归并整理,边界外的删掉
    分代:分新生代,老生代,新生代复制,老生代标记整理
  16. JVM 有哪些垃圾回收器
    上面三种是复制算法(新生代),下面msc,po,g1是标记整理,CMS是标记清除
  17. 简述分代垃圾回收器是怎么工作的
    新生代老生代之间过渡通过年龄计算,先进入新生代,其中分为Eden,tosurvivior,from survivor,ef两种向t中移动,存活一次年龄加一,年龄超过15进入老生代,大对象则直接进入老生代,老生代达到一定大小就fullgc,一般是标记整理
  18. 简述java内存分配与回收策略
    对象优先在新生代eden区分配,大对象直接进入老生代,对象存活超过一定时间周期必然进入老生代
  19. 类装载的执行过程
    加载查找class文件,验证class类的正确性,准备静态变量分配内存,解析内存引用指向,初始化静态变量和代码块
  20. 简述java类加载机制
    还是上个问题的流程,虚拟机把数据加载为类文件,验证,准备解析,初始化,形成可执行的java文件
  21. JVM加载Class文件的原理机制
    java的字节码都需要加载到虚拟机中才能运行,通常不需要关心,但使用反射的话,就需要了解,分显隐两种加载看,显式是class.forname手动加载,隐式就还是new对象时装到虚拟机里

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795664.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存