当前位置: 首页 > 面试题库 >

在Java中的堆栈存储器上创建对象?

娄弘
2023-03-14
问题内容

出于好奇,这只是一个简单的理论问题。我一直像一个Java迷男孩。但是有一件事让我怀疑为什么Java不提供在堆栈上创建对象的机制?如果我可以在堆栈上创建小的Point(int
x,int y)对象而不是像在C#上创建结构那样的堆,效率会更高。java中的此限制背后是否有任何特殊的安全原因?:)


问题答案:

这里的策略是Java不会将这个决定泄漏给语言,而是让JVM / Hotspot / JIT / runtime决定在哪里以及如何分配内存。

正在进行使用“转义分析”的研究,以找出实际上并不需要将哪些对象放入堆并对其进行堆栈分配的对象。我不确定这是否已经使其成为mainstrem
JVM。但是,如果是这样,它将由运行时(东西-XX:something)而不是开发者来控制

这样做的好处是,即使是旧代码也可以从这些将来的增强功能中受益,而无需对其本身进行更新。

如果您想手动管理它(但是仍然让编译器检查它是否保持“安全”),请看一下Rust。



 类似资料:
  • 问题内容: 我在标准Windows命令窗口中有一个正在运行的Java进程。即我已经运行’cmd’并在java -jar中键入… 我需要尽可能获得所有线程的完整堆栈转储。 我记得在Linux下,您可以通过quit命令上的选项将消息发送到JVM。 在此文件中为太阳状态 若要在Windows 95或Windows NT平台上生成堆栈跟踪,请在运行Java程序的窗口中输入键序列,或单击窗口上的“关闭”按钮

  • 问题内容: 我有一个这样的数组声明: 这是原始类型的数组。该数组存储在哪里?它存储在堆还是堆栈上?这是一个原始类型,所有原始类型都不存储在堆上。 问题答案: 正如gurukulki所说,它存储在堆中。但是,你的帖子提出了一个误解,可能是由于一些善意的人传播了“原始生物始终存在”的神话。这是不正确的。局部变量在堆栈上有其值,但并非所有原始变量都是局部的… 例如,考虑一下: 现在,住在哪里?神话暗示它

  • 问题内容: 假设我有两个陈述。 哪个是堆栈内存,哪个存储在堆中? 两者之间有什么区别? 创建了多少个对象,内存中的引用如何? 最佳做法是什么? 问题答案: 所有对象都存储在堆中(包括其字段的值)。1个 局部变量(包括参数)始终包含原始值或引用,并存储在堆栈中。1个 因此,对于您的两行: 您将在堆上有两个对象(两个包含的String对象)和两个引用(每个对象一个)在堆栈上(提供且是局部变量)。 (实

  • 问题内容: 任何人都可以用C,C ++和Java清楚地解释一下。什么都在堆栈上,什么都在堆上以及何时分配。 我所知道的, 每个函数调用的所有局部变量(无论是基元,指针还是引用变量)都在新的堆栈框架上。 使用new或malloc创建的所有内容都会进入堆。 我对几件事感到困惑。 是在堆上创建的对象成员的引用/基元是否也存储在堆上? 以及在每个框架中递归创建的方法的那些本地成员呢?它们都在堆栈上吗?如果

  • 问题内容: 我对Java不太了解。 我浏览了几个链接,发现博客上写着“ Java Primitives存储在堆栈上”,我觉得这取决于实例变量或局部变量。 经过几个链接后,我的结论是, 类变量(基元)作为对象包含的对象的一部分存储在堆中。 类变量– object(用户定义)–作为其包含的Object的一部分存储在堆中。对于参考对象和实际对象都是如此。 方法变量-基元-作为该堆栈框架的一部分存储在堆栈

  • 我对Java没什么概念。 我浏览了一些链接,发现博客上写着“存储在堆栈上的Java原语”,我觉得这取决于实例变量或局部变量。 经过几个环节,我的结论是, 类变量(原语)作为对象的一部分存储在堆中。 类变量——对象(用户定义)——作为对象的一部分存储在堆中。这对于参考对象和实际对象都是正确的。 方法变量——基元——作为堆栈框架的一部分存储在堆栈上。 方法变量-对象(用户定义)-存储在堆上,但是对堆上