如何知道我们的对象使用了多少内存?
How to know how much memory our object uses?
我知道int使用32位。 Long 使用 64 位等...但是,我们怎么知道我们的对象使用了多少内存?我有一个 class 这样的:
class Utils{
public String getName(Context context){
return "Sambhav"
}
}
现在,我怎么知道这个 class 使用了多少内存?
你不能。你只能做一些非常粗略的估计。这取决于您的 JRE 版本。
- 每个实例都有用于管理信息的最小内存占用,例如对定义的引用 class,可能是 16 个字节。
- 对于每个实例字段,添加该字段的“大小”,如果字段类型比 JRE 中使用的默认对齐方式短,则加上一些填充。
- A class 是名为
Class
的 class 的实例,除了声明的字段 static
之外,还有很多内部字段和数据结构。它“保存”了在那里定义的方法的字节码,以及来自 HotSpot Just-In-Time 编译器的任何已编译本机方法版本。因此,几乎不可能估计向 JRE 添加新 class 的内存消耗。
- 像
"Sambhav"
这样的字符串文字会添加一个 String
实例到常量池中(如果它不存在的话)。 String
实例至少有一个长度字段和一个包含字符的数组。内部细节随着不同版本的 JRE 而改变。
现在分析您的 Utils
class 片段:
- 你只有class,没有实例。因此,将 class 的(未知)内存占用添加到您的计算中。
- 您的用户代码需要一个
String
常量池中可能不存在的文字。因此,在您的计算中添加两个实例,一个 String
实例加一个 character-holding 数组,数组的占用空间当然取决于字符串长度。
我知道int使用32位。 Long 使用 64 位等...但是,我们怎么知道我们的对象使用了多少内存?我有一个 class 这样的:
class Utils{
public String getName(Context context){
return "Sambhav"
}
}
现在,我怎么知道这个 class 使用了多少内存?
你不能。你只能做一些非常粗略的估计。这取决于您的 JRE 版本。
- 每个实例都有用于管理信息的最小内存占用,例如对定义的引用 class,可能是 16 个字节。
- 对于每个实例字段,添加该字段的“大小”,如果字段类型比 JRE 中使用的默认对齐方式短,则加上一些填充。
- A class 是名为
Class
的 class 的实例,除了声明的字段static
之外,还有很多内部字段和数据结构。它“保存”了在那里定义的方法的字节码,以及来自 HotSpot Just-In-Time 编译器的任何已编译本机方法版本。因此,几乎不可能估计向 JRE 添加新 class 的内存消耗。 - 像
"Sambhav"
这样的字符串文字会添加一个String
实例到常量池中(如果它不存在的话)。String
实例至少有一个长度字段和一个包含字符的数组。内部细节随着不同版本的 JRE 而改变。
现在分析您的 Utils
class 片段:
- 你只有class,没有实例。因此,将 class 的(未知)内存占用添加到您的计算中。
- 您的用户代码需要一个
String
常量池中可能不存在的文字。因此,在您的计算中添加两个实例,一个String
实例加一个 character-holding 数组,数组的占用空间当然取决于字符串长度。