gpt4 book ai didi

Java int 内存使用情况

转载 作者:IT老高 更新时间:2023-10-28 20:56:36 24 4
gpt4 key购买 nike

当我在思考各种类型的内存使用情况时,我开始对 Java 在传递给方法时如何利用内存来存储整数感到有些困惑。

说,我有以下代码:

public static void main (String[] args){
int i = 4;
addUp(i);
}

public static int addUp(int i){
if(i == 0) return 0;
else return addUp(i - 1);
}

在以下示例中,我想知道我的以下逻辑是否正确:

  • 我最初为整数 i = 4 创建了一个内存。然后我将它传递给一个方法。但是,由于Java中没有指向原语,所以在addUp(i == 4)中,我创建了另一个整数i = 4。然后,还有另一个addUp(i == 3),addUp(i == 2), addUp(i == 1), addUp(i == 0) 其中每次由于没有指向值,所以在内存中分配一个新的 i 值。
  • 那么对于单个“int i”值,我使用了 6 个整数值内存。

但是,如果我总是通过数组传递它:

public static void main (String[] args){
int[] i = {4};
// int tempI = i[0];
addUp(i);
}

public static int addUp(int[] i){
if(i[0] == 0) return 0;
else return addUp(i[0] = i[0] - 1);
}

- 因为我创建了一个大小为 1 的整数数组,然后将其传递给 addUp,它将再次传递给 addUp(i[0] == 3), addUp(i[0] == 2), addUp(i [0] == 1), addUp(i[0] == 0),我只需要使用 1 个整数数组内存空间,因此更具成本效益。此外,如果我要预先创建一个 int 值来存储 i[0] 的初始值,我仍然有我的“原始”值。

那么这就引出了一个问题,为什么人们在 Java 方法中传递像 int 这样的原语?仅传递这些原语的数组值不是更节省内存吗?还是第一个示例仍然只是 O(1) 内存?

在这个问题之上,我只是想知道使用 int[] 和 int 的内存差异,特别是对于 1 的大小。提前谢谢你。我只是想知道使用 Java 可以提高内存效率,这让我想到了。

Thanks for all the answers! I'm just now quickly wondering if I were to "analyze" big-oh memory of each code, would they both be considered O(1) or would that be wrong to assume?

最佳答案

这里缺少什么:示例中的 int 值位于 stack ,不在堆上。

与堆上的对象相比,处理堆栈上存在的固定大小的原始值的开销要少得多!

换句话说:使用“指针”意味着您必须在堆上创建一个新对象。 所有对象都在堆上;数组没有 no 堆栈!在您停止使用对象后,它们会立即成为垃圾收集的对象。另一方面,堆栈在调用方法时来来去去!

除此之外:请记住,编程语言提供给我们的抽象旨在帮助我们编写易于阅读、理解和维护的代码。您的方法基本上是进行某种微调,从而导致更复杂的代码。这不是 Java 解决此类问题的方式。

含义:对于 Java,真正的“性能魔法”发生在运行时,即即时编译器启动时!您会看到,当“经常”调用方法时,JIT 可以内联调用小方法。然后将数据“紧密”在一起变得更加更加重要。如:当数据存在于堆中时,您可能必须访问 memory 才能获取值。而存在于堆栈中的项目 - 可能仍然“关闭”(如:在处理器缓存中)。因此,您优化内存使用的小想法实际上可能会使程序执行速度减慢几个数量级。因为即使在今天,访问处理器缓存和读取主存之间也存在数量级。

长话短说:避免针对性能或内存使用进行此类“微调”:JVM 针对“正常、典型”用例进行了优化。因此,您尝试引入巧妙的解决方法很容易导致“不太好”的结果。

所以 - 当您担心性能时:做其他人都在做的事情。如果 一个 真的关心 - 然后了解 JVM 如何工作。事实证明,即使是我的知识也有些过时了——因为评论暗示 JIT 可以内联堆栈上的对象。从这个意义上说:专注于编写简洁、优雅的代码,以直接的方式解决问题!

最后:这可能会在某些时候发生变化。有想法将 true 值值对象引入 java。它基本上住在堆栈上,而不是堆上。但不要指望这会在 Java10 之前发生。或者 11. 或者 ...(我认为 this 在这里是相关的)。

关于Java int 内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45571306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com