use*_*241 1 java heap-memory stack-memory
我正在学习一些具有 C++ 背景的 Java 课程和对象课程。我想知道为什么我们不能选择在堆栈内存上声明的对象?为什么除了原始类型之外的所有内容都必须放在堆上?
这是澄清我所问内容的一些内容。
本质上,如果我们有:
Scanner input = new Scanner(System.in);
那么为什么我们不能首先将它放在堆栈上呢?
原始 Java 设计(20 世纪 90 年代中期)最强大的吸引力之一就是简单性。支持基于堆的对象是必不可少的,而基于堆栈的对象是一种优化。Java 并不孤单:许多语言都采用这种方法(LISP、Haskell、JavaScript、Ruby 等)。基于堆栈的分配确实发生在 Java 中,但只是作为一种内部优化技巧,而不是用户可以控制的东西。
特别要记住,被调用者如何处理传递给函数的指向对象的指针(Java 中的“传递给方法的引用”)有一个本质的区别:不允许保留指针如果它是基于堆栈的。仅此一点就造成了巨大的复杂性和错误机会。
最后,与 C 和 C++ 等手动管理语言相比,基于堆栈的对象给垃圾收集语言带来的影响要小得多。
| 归档时间: |
|
| 查看次数: |
878 次 |
| 最近记录: |