Java';s new关键字必然表示堆分配?

Java';s new关键字必然表示堆分配?,java,memory,heap,allocation,Java,Memory,Heap,Allocation,我试图写一些快速的东西,不断地分配和释放内存,这使得内存分配的位置在性能方面非常重要 分配对象是否总是将它们分配到堆?JIT编译可以进行任何类型的奇特的分配优化吗?使用new分配的对象被放置在堆上,但是JIT/JVM可能会使用转义分析对它们进行优化以进行堆栈。了解更多信息: vm可以使用一种称为escape分析的技术,通过这种技术,他们可以判断某些对象在其整个生命周期内都被限制在单个线程中,并且该生命周期受给定堆栈帧的生命周期的限制。这样的对象可以在堆栈而不是堆上安全地分配 您不可能直接控制堆栈

我试图写一些快速的东西,不断地分配和释放内存,这使得内存分配的位置在性能方面非常重要


分配对象是否总是将它们分配到堆?JIT编译可以进行任何类型的奇特的分配优化吗?

使用
new
分配的对象被放置在堆上,但是JIT/JVM可能会使用转义分析对它们进行优化以进行堆栈。了解更多信息:

vm可以使用一种称为escape分析的技术,通过这种技术,他们可以判断某些对象在其整个生命周期内都被限制在单个线程中,并且该生命周期受给定堆栈帧的生命周期的限制。这样的对象可以在堆栈而不是堆上安全地分配

您不可能直接控制堆栈分配,就像您无法预测GC何时运行一样。如果您真的需要对内存机制进行如此深入的控制,唯一的方法就是使用C/C++

无论如何,在过度复杂化你的软件之前要三思。我在上面链接的论文的结论非常清楚地说明了内存管理:

JVM出人意料地擅长找出我们过去认为只有开发人员才能知道的事情。通过让JVM根据具体情况在堆栈分配和堆分配之间进行选择,我们可以获得堆栈分配的性能优势,而不会让程序员为是在堆栈上还是在堆上进行分配而苦恼


这并不意味着您永远不需要对内存进行细粒度控制,但在大多数情况下,JVM可以比普通程序员更好地进行优化。

JLS说
new
分配一个新对象。JLS 12.5:

“当类实例创建表达式(§15.9)的求值导致类实例化时,将显式创建新的类实例。”

JLS没有说明对象的分配位置。如果编译器可以推断(通过转义分析)可达性规则允许在堆栈上分配对象,那么这是允许的

JLS通常被理解为允许优化,其效果无法通过观察执行程序的结果来检测。显然,Java 7的最新版本是执行的优化之一,其中包括优化异常创建/抛出/捕获代码,并用无条件跳转语句(或类似语句)替换它。在某些情况下,这种优化包括优化掉显式的
new
语句


总之,
new
表达式通常会导致堆分配,但有时会在堆栈上分配对象,有时分配是完全优化的。

您是否分析了应用程序以确定堆分配太慢,或者您只是在做假设?我的应用程序是向量数学密集型的,并且向量类是不可变的。虽然我对配置工具不太熟悉,但是我不知道如何告诉你在分配中花费了多少时间,而其他的事情都是这样,所以我想我正在做假设(惭愧的是,HEH),如果你需要极端的性能,你可以把向量类逻辑和它移植到C++,然后使用JNI与你的类集成。这有打破平台独立性的缺点,但是如果它是一段很小的代码,它就可以了。您可以为大多数平台提供一个“官方”编译版本,并将.cpp文件与您的应用程序一起分发,以便外来平台的用户能够自己编译库。啊,太好了,谢谢!我想知道是否有工具来监控何时发生这种情况。“不过我很怀疑。”我从来没有试过卷心菜,但它可以帮助你。