Java面试题中高级进阶(JVM篇Java垃圾回收)

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

前言

本来想着给本身放松一下,刷刷博客,突然被几道面试题难倒!说说Java对象创建过程?知道类的生命周期吗?简述Java的对象结构?如何判断对象可以被回收?JVM的永久代中会发生垃圾回收么?你知道哪些垃圾网络算法?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘
*** 12万字的java面试题整理 ***
说说Java对象创建过程


  • JVM碰到一条新建对象的指令时首先去查抄这个指令的参数是否能在常量池中界说到一个类的符号引用。然后加载这个类
  • 为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,终极常用的办法“本地线程缓冲分
    配(TLAB)”
  • 将除对象头外的对象内存空间初始化为0
  • 对对象头举行必要设置
知道类的生命周期吗?

类的生命周期包括这几个部分,加载、连接、初始化、利用和卸载,其中前三部是类的加载的过程


  • 加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
  • 连接,连接又包含三块内容:验证、准备、初始化。 1)验证,文件格式、元数据、字节码、符号引用验证; 2)准备,为类的静态变量分配内存,并将其初始化为默认值; 3)解析,把类中的符号引用转换为直接引用
  • 初始化,为类的静态变量赋予精确的初始值
  • 利用,new出对象程序中利用
  • 卸载,执行垃圾回收
简述Java的对象结构

Java对象由三个部分构成:对象头、实例数据、对齐添补。

  • 对象头由两部分构成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一样平常占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中另有一部分用来记录数组长度。
  • 实例数据用来存储对象真正的有效信息(包括父类继承下来的和本身界说的)
  • 对齐添补:JVM要求对象起始地点必须是8字节的整数倍(8字节对齐)
如何判断对象可以被回收?

判断对象是否存活一样平常有两种方式:

  • 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用开释时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
  • 可达性分析(Reachability Analysis):从GC Roots开始向下搜刮,搜刮所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象
JVM的永久代中会发生垃圾回收么?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(FullGC)。如果你仔细查看垃圾网络器的输出信息,就会发现永久代也是被回收的。这就是为什么精确的永久代巨细对避免Full GC是非常重要的缘故原由。请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)
你知道哪些垃圾网络算法

GC最底子的算法有三种: 标记 -打扫算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一样平常都采用分代网络算法。

  • 标记 -打扫算法,“标记-打扫”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“打扫”两个阶段:首先标记出全部需要回收的对象,在标记完成后统一回收掉全部被标记的对象。
  • 复制算法,“复制”(Copying)的网络算法,它将可用内存按容量划分为巨细相称的两块,每次只利用其中的一块。当这一块的内存用完了,就将还存在世的对象复制到别的一块上面,然后再把已利用过的内存空间一次清理掉。
  • 标记-压缩算法,标记过程仍然与“标记-打扫”算法一样,但后续步骤不是直接对可回收对象举行清理,而是让全部存活的对象都向一端移动,然后直接清理掉端边界以外的内存
  • 分代网络算法,“分代网络”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的网络算法。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表