Java面试那点事——基础 200109

1.说一下对象创建的过程?对象有哪几部分构成?虚拟机如何访问对象?

(1)对象创建的过程

  • 类加载检查:在执行到new命令时,查看new后面的参数是否正确定位到常量池中的符号引用,并且该符号引用是否被正确的加载、连接和初始化。
  • 内存分配:为对象分配内存,有指针碰撞和空闲列表两种方式。
    • 指针碰撞:适用于内存完整,无碎片。内存使用和未使用中间由指针隔开,分配的时候指针移动相应的位置。
    • 空闲列表:适用于内存不完整,有碎片。维护一个列表,列表记录可用的内存,使用时分配给对象一个足够的内存空间并更新列表
  • 初始化零值:将对象分配到的空间初始化零值(不包括对象头)
  • 设置对象头:对象头信息包括哈希码、GC分代信息、元数据信息、对象是哪个类的示例
  • 执行init方法:给对象设置程序值,执行构造方法。

(2)对象在内存中的组成部分(对象在内存的划分、对象的内存布局)

  • 对象头:
    • 第一:元数据、GC分代、哈希值等自身运行信息;
    • 第二:类型指针,确定属于哪个类的实例
  • 实例数据:对象真正存储的有效信息,定义的各种字段的值。
  • 对齐填充:没有实际意义,JVM内存地址需要8字节的整数倍

(3)虚拟机如何访问对象

  • 句柄:堆中专门划分一个区域作为句柄池,虚拟机栈存储是堆中句柄的地址,句柄存储的是对象的实例数据和类型数据的地址
  • 直接指针:栈中的引用直接指向的就是对象的实例数据和类型数据的地址。

对比:直接指针避免二次寻址;在对象移动时,只修改句柄地址而不懂改变引用的地址。


2.java 中都有哪些引用类型?

  • 强引用:new 语句产生的都是强引用,虚拟机不会主动去回收,即便内存溢出,也是会抛出异常而不是回收强引用。可以将对象=null,从而在垃圾回收器在下一次回收。
  • 软引用:在内存足够时,不会回收,在内存不足时,会回收。常用于缓存技术。
  • 弱引用:垃圾回收器遇到该引用就会回收,常与引用队列一起使用
  • 虚引用:最弱的引用,在对象被JVM回收之后收到一个系统通知,用于追踪垃圾回收过程,必须与应用队列一起使用。

弱引用和虚引用很少用,软引用使用比较多,用于加速JVM对垃圾内存的回收速度,维护系统安全,防止内存溢出


3.怎么判断对象是否可以被回收?

3.1对象标记算法:

  • 引用计数法:引用+1,引用失效-1,对象引用为0,则不可在使用;无法解决对象互相循环引用的问题。
  • 可达性分析:选用某些对象作为GC Roots节点,从Roots节点向下搜索,形成一个引用链,所有不在引用链上的对象都是不可使用的对象

可以作为GC Roots的节点:

  • 虚拟机栈引用对象
  • 全局静态变量
  • 常量
  • 本地栈引用对象

3.2判断回收

需要进行二次标记,标记使用的是上面的算法

  • 第一次标记:所有没在GC Roots引用链上的对象都进行第一次标记,所有执行过finalize方法或者未覆盖finalize方法的对象,直接回收;除此之外的标记过一次的对象都进入到F-Queue队列中。
  • 对F-Queue中的对象进行二次标记,如果在finalize方法中,对象又重新加入引用链,则不回收,否则就进行回收。

4.内存泄露和内存溢出分别是什么?什么原因造成?如何避免?

  • 内存泄露:本应被回收的对象因为其他对象的引用而不能被回收,从而在堆中寄存,造成内存泄露
  • 内存溢出:无法为对象分配足够的内存

内存泄露是内存溢出的主要诱因。


原因:

  • 内存泄露
    • 长周期对象持有短周期对象的引用
    • 对象地址被更改,从而找不到对象(常见于哈希值)
    • 长时间进行耗费资源的连接
  • 内存溢出
    • 堆内存,对象申请过多
    • 栈内存:递归太深或者方法调用层级过多
    • 方法区:加载的类过多

避免:

  • 不要在循环中创建对象
  • 不要一次调用过多数据
  • 大量字符串使用StringBuffer
  • 方法区很少进行垃圾回收,尽量避免申请常量和静态变量

5.给对象分配内存如何保证线程安全?

  • CAS+失败重试:CAS是乐观锁,每次都假设成功,在执行,失败就重试,找到成功。保证更新的原子性
  • TLAB:为每一个线程,预先在Eden区域分配一块内存,对象先分配到这里,当该区域内存不足或用完之后,使用CAS+失败重试机制

【Java 面试那点事】

这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!

这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】

面试路上,你不孤单!
在这里插入图片描述

发布了147 篇原创文章 · 获赞 835 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/qq_33945246/article/details/103918648