网管 发布的文章

Java 中可作为 GC Roots 的对象有哪几种?GC Roots主要包括以下四种对象:虚拟机栈(栈帧中的本地变量表)中引用的对象:虚拟机栈中保存着每个线程的方法调用和局部变量信息,当一个方法被调用时,会在虚拟机栈中创建对应的栈帧,栈帧中的本地变量表中引用的对象被视为GC Roots。

- 阅读剩余部分 -

对象怎么访问定位?在Java程序中,通过栈上的引用数据来操作堆上的具体对象。根据《Java虚拟机规范》,引用类型只规定了它是指向对象的引用,没有定义这个引用应该如何定位和访问堆中对象的具体位置。因此,对象的访问方式是由虚拟机实现确定的,主要有两种主流方式:使用句柄和直接指针。

- 阅读剩余部分 -

JVM 里 new 对象时,堆会发生抢占吗?JVM 是怎么设计来保证线程安全的?当多个线程同时进行对象的内存分配时,可能会出现指针抢占的问题。假设在JVM虚拟机上,每次进行对象分配时,指针会向右移动一个对象大小的距离。当一个线程正在为对象A分配内存时,指针尚未更新。同时,另一个线程也需要为对象B分配内存,并使用了同一个指针进行分配,这就发生了抢占现象。

- 阅读剩余部分 -

什么是指针碰撞?什么是空闲列表?内存分配可以采用两种方式:指针碰撞(Bump The Pointer)和空闲列表(Free List)。指针碰撞方式假设Java堆中的内存是绝对规整的,已使用的内存和空闲的内存分别放置在堆的两端,两者之间通过一个指针作为分界点的指示器进行区分。在这种情况下,内存分配仅需要将指针向空闲空间的方向移动一段与对象大小相等的距离,从而完成内存的分配,因此称为"指针碰撞"。

- 阅读剩余部分 -