java - 在 Java 中赋值后的内存分配
问题描述
我想知道在变量声明和赋值的简单情况下如何分配内存。假设我们有以下内容:
诠释一个;
据我所知,一旦我们 daclare int a 分配了 4 个字节;. 但是,当我们为 a 赋值时,内存是如何工作的?我想以下之间在内存方面存在差异:
a = 1; a = 1000000;
所以,实际上,问题是赋值如何影响内存。
解决方案
局部变量由编译器在方法的调用堆栈上分配。
void f(int a, String b) {
String d = "";
for (int i = 0; i < 10; ++i) {
int c;
c = a*i;
d = d + b;
}
}
堆:
Compiler stores frame size of `f(int, String)`: 28
fp[0] int a
fp[4] String b
fp[12] String d
fp[16] int c
fp[24] int i
fp[28]
每次通话都会发生这样的事情:
checkStackCanReserveFrameWithSize(28); // can throw OutOfMemoryException
复制的是
- 原始类型的值,或
- 对象的对象引用。
所以没有分配分配。
上面d + b
做了一个分配, String.concat(String)
.
- 字段变量作为对象分配的一部分进行分配。
- 静态字段变量(全局字段)被分配为类初始化。
推荐阅读
- javascript - 获取多个动态添加的材质自动完成输入以在 valueChange 上调用相同的方法
- asp.net-core - Aspnetboilerplate:如何执行原始 sql 查询
- javascript - JavaScript 阻止表单提交
- spring - 启动 ApplicationContext 时出错。要显示条件报告,请在启用“调试”的情况下重新运行您的应用程序。
- python - 将一组模型分配给另一个模型
- windows - 在 Windows 10 上找不到 docker-machine 命令
- elasticsearch - Lucene/Solr 搜索文档创建
- c++ - 我不断收到 UE4 FPS 第 3.1 节教程的错误。我应该怎么办?
- python - 如何让 tkinter OptionMenu 显示所选选项的名称?
- excel - 如何知道 Windows 资源管理器预览窗格正在启动 VSTO Word 和 Excel 插件?