关于java:面试官new-关键字在-JVM-中是如何执行的

30次阅读

共计 974 个字符,预计需要花费 3 分钟才能阅读完成。

问:new 关键字在虚拟机中是怎么的一个过程?JVM 结构对象的步骤都有哪些?

1、解答

2、Java 对象创立流程

指针碰撞

如果 Java 堆中的内存是相对规整的,所有用过的内存都放在一边,闲暇的内存放在另一边,两头放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向闲暇空间那边揶动一段与对象大小相等的间隔,这种调配形式称为“指针碰撞”(Bump the Pointer)。

闲暇列表

如果 Java 堆中的内存并不是规整的,已应用的内存和闲暇的内存互相交织,那就没有方法简略地进行指针碰撞了,虚拟机就必须保护一个列表,记录上哪些内存块是可用的,在调配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种调配形式称为“闲暇列表”(Free List)。

怎么判断 Java 堆内存是否规整?

Java 堆是否规整由所采纳的垃圾收集器是否带有压缩整顿性能决定。应用标记整顿法比方 Serial、ParNew 的收集器时,零碎采纳的调配算法是指针碰撞,而应用标记清理法比方 CMS 的收集器时,则通常采纳闲暇列表。

怎么保障创建对象时的线程安全性?

问题阐明

对象创立在虚拟机中是十分频繁的行为,即便是仅仅批改一个指针所指向的地位,在并发状况下也并不是线程平安的,可能呈现正在给对象 A 分配内存,指针还没来得及批改,对象 B 又同时应用了原来的指针来分配内存的状况。

解决方案

  1. 对分配内存空间的动作进行同步解决,虚拟机采纳 CAS 配上失败重试的形式保障更新操作的原子性。
  2. 把内存调配的动作依照线程划分在不同的空间之中进行,即每个线程在 Java 雄中事后调配一小块内存,称为本地线程调配缓冲 TLAB(Thread Local Allocation Buffer)。哪个线程要分配内存,就在哪个线程的 TLAB 上调配,只有 TLAB 用完并调配新的 TLAB 时,才须要同步锁定。

起源:https://blog.csdn.net/Shockan…

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0