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

JVM creating Objects on the Stack? (and more)

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

假设我们在方法中创建了一个临时对象。 并且这个对象的引用永远不会在方法之外得到 passed/stored/accessed 。 仅供内部使用。

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

  1. 在堆中找到一个足够大的地方来容纳对象
  2. 分配 space
  3. 更新引用指针
  4. 使用垃圾回收注册对象
  5. [...对象被使用,最终被丢弃...]
  6. 识别垃圾收集
  7. 从堆中移除
  8. 从 GC 注销

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

那么有 JVM 对此进行优化吗?

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

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

有点,有一个名为 valhalla 的项目旨在为 java 提供值类型,它已经可以下载和使用,但尚未准备好用于生产(如果准备好,然后它可能会被合并到 java 官方版本之一。
您可以下载早期访问版本。您可以从 https://jdk.java.net/valhalla/ and page about feature itself: https://openjdk.java.net/jeps/169

下载 EA 版本

补充说明: Java 不使用引用计数,GC 的工作方式是寻找明确使用过的根对象,比如来自当前执行方法的对象,然后找到从这些根引用的任何其他对象,并删除所有其他对象。

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