当前位置: 首页 > 后端技术 > Java

面试官:new关键字在JVM中是如何实现的?

时间:2023-04-01 21:09:38 Java

Q:new关键字在虚拟机中的过程是怎样的?JVM构造对象的步骤是什么?1.答案2.Java对象创建过程的指针碰撞如果Java堆中的内存是绝对有规律的,所有使用的内存都放在一边,空闲的内存放在另一边,中间放一个指针为分界点的指示分配的内存只是将指针指向空闲空间的距离等于对象的大小。这种分配方法称为“BumpthePointer”。freelist如果Java堆中的内存不规则,已用内存和空闲内存相互交错,那么简单的指针碰撞是没办法的,虚拟机必须维护一个list来记录哪些内存块是available分配时,从链表中找到足够大的空间分配给对象实例,并更新链表上的记录。这种分配方式称为“空闲列表”(FreeList)。如何判断Java堆内存是否正常?Java堆是否规则取决于所使用的垃圾收集器是否具有压缩功能。在使用Serial、ParNew收集器等mark-and-clean方式时,系统采用的分配算法是指针碰撞,而在使用CMS收集器等mark-and-clean方式时,通常使用freelist。创建对象时如何保证线程安全?该问题表明对象创建是虚拟机中非常频繁的行为。即使只是修改指针指向的位置,在并发情况下也不是线程安全的。有可能内存正在分配给对象A,指针还没来得及修改,对象B同时使用原始指针分配内存。该方案同步分配内存空间的动作,虚拟机采用失败重试的CAS保证更新操作的原子性。内存分配的动作是根据线程划分不同的空间,即每个线程预先分配一小块内存,在Java中称为本地线程分配缓冲区TLAB(ThreadLocalAllocationBuffer)。无论哪个线程想要分配内存,它都会在该线程的TLAB上分配。只有当TLAB用完,分配新的TLAB时,才需要同步锁。来源:https://blog.csdn.net/Shockan...近期热点文章推荐:1.1000+Java面试题及答案(2021最新版)2.终于从开源项目中拿到了IntelliJIDEA激活码,于是香!3、阿里Mock工具正式开源,秒杀市面上所有Mock工具!4、SpringCloud2020.0.0正式发布,全新颠覆版本!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!