JVM是否在堆栈上创建对象? (和更多)

问题描述 投票:0回答:1

是否有在堆栈上创建对象的JVM?还是不通过引用计数器等与Java垃圾收集交互的JVM?

假设我们在方法中创建了一个临时对象。而且,该对象的引用永远不会在方法外部传递/存储/访问。它仅在内部使用。

当遵循经典的对象分配方法(在堆栈上,以及引用计数器)时,必须注意以下步骤:

  1. 在堆中找到足够大的位置来容纳对象
  2. 分配空间
  3. 更新参考指针
  4. 用垃圾回收注册对象
  5. [...对象被使用,最终被丢弃...]
  6. 识别垃圾收集
  7. 从堆中删除
  8. 从GC取消注册

因此,如果现在虚拟机在堆栈上创建对象,则不需要步骤1,3,4,6,7,8,而步骤2及其对应的7ish则很容易进行堆栈管理。

那么有没有JVM对此进行了优化?

或者任何混合系统,例如在堆中分配对象,但不接触普通GC,而是直接在对象范围的末尾删除对象?

是否有带有多个堆的实现(一个GC监督,另一个在堆栈监督)?

java memory-management jvm heap
1个回答
2
投票

Kinda,有一个名为valhalla的项目,旨在为java提供值类型,它已经可以下载和使用,但是还没有准备好用于生产用途(如果准备好了,那么可能会被合并。到Java官方发行版之一)。您可以下载早期访问版本。您可以从https://jdk.java.net/valhalla/下载EA版本,并下载有关功能本身的页面:https://openjdk.java.net/jeps/169

附加说明:Java不使用引用计数,GC通过查找明确使用的根对象(例如当前执行的方法中的对象)来工作,然后从这些根中查找任何其他引用的对象,并删除所有其余对象。

JIT还执行转义分析,根本不需要分配对象,而是仅使用堆栈来存储通常存储在该对象中的数据。 (请注意,这不是堆栈分配,因为甚至没有创建对象)。而且由于内联,它也可以实现这种交叉方法,但是您无法控制它或无法保证它会发生。

© www.soinside.com 2019 - 2024. All rights reserved.