java - JVM 中的内存分配

标签 java memory-management

我正在考虑 Java 中的内存分配,即 存储位置方法、字段和对象。

假设我有 2 个类

import java.util.*;
class ABC
{
int field;
List<Integer>l;
}   
class XYZ 
{
int x,y,z;
static int p;
void fun(ABC a){
    a.field = 10;
    a.l = new ArrayList<Integer>(10);
    a.l.add(10);
}
}   
public class Simulator{
public static void main(String[] arg){
    XYZ tmp_1 = new XYZ();
    ABC tmp_2 = new ABC();
    tmp_1.fun(tmp_2);
    System.out.println(tmp_2.l);
}

}

现在将为每个数据成员、函数和对象分配内存在哪里?

我的想法是对象,数据成员将存储在堆中,但我不确定函数及其数据成员?

最佳答案

是的,所有对象都分配在堆上。即:使用 new 创建的所有内容都将放在堆上。因此,此类对象的所有字段也在堆上。

我想您指的是函数中的局部变量和参数。这些都放在堆栈上(对于函数的每次调用)。但是请注意,当函数变量/参数是引用类型时,它们指向的实际对象在堆上,但变量/参数本身将在堆栈上(类似于 C/C++ 中的指针)。另一方面,原始类型(如 intdouble 等)的函数变量/参数将完全在堆栈上。与主题稍微相关但相关的是 boxing 的概念。 .

函数本身是静态代码,存储在所有可执行代码所在的内存的特殊部分。请注意,一个类的所有实例都共享相同的函数(即“新函数”不是用新创建的对象创建的,即使这些函数是实例函数)。因此,当您在对象上调用实例函数时,一个特殊的 this 引用将传递给该函数(它是该函数的隐式参数)。这就是函数如何知道它应该作用于哪些对象。

关于java - JVM 中的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9554415/

相关文章:

java - 使 JButton 不可见,但可点击?

java - 如何将字节字符串转换为字节[]

java - 从区域设置获取正确的日期格式和时间格式

c - 可以转换为在 C 运行时确定的给定类型的指针吗?

Java:线程本地内存分配和可扩展性

iphone - 为什么要写[anView release], anView = nil;而不是 [anView 发布];?

java - 从字符串中提取字符(Ant - Eclipse)

java - Maven,配置具体目标

java - 解析/保存/缓存多个文件时减少 Java 内存使用

objective-c - 我必须自动释放这个对象吗?