一个拥有100个属性的对象所消耗的内存空间是否与100个对象各有一个属性所消耗的内存空间相同?
为一个对象分配了多少内存? 添加属性时使用了多少额外空间?
一个拥有100个属性的对象所消耗的内存空间是否与100个对象各有一个属性所消耗的内存空间相同?
为一个对象分配了多少内存? 添加属性时使用了多少额外空间?
当前回答
程序的总已用/空闲内存可以在程序中通过
java.lang.Runtime.getRuntime();
运行时有几个与内存相关的方法。下面的代码示例演示了它的用法。
public class PerformanceTest {
private static final long MEGABYTE = 1024L * 1024L;
public static long bytesToMegabytes(long bytes) {
return bytes / MEGABYTE;
}
public static void main(String[] args) {
// I assume you will know how to create an object Person yourself...
List <Person> list = new ArrayList <Person> ();
for (int i = 0; i <= 100_000; i++) {
list.add(new Person("Jim", "Knopf"));
}
// Get the Java runtime
Runtime runtime = Runtime.getRuntime();
// Run the garbage collector
runtime.gc();
// Calculate the used memory
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Used memory is bytes: " + memory);
System.out.println("Used memory is megabytes: " + bytesToMegabytes(memory));
}
}
其他回答
不,注册一个对象也会占用一些内存。100个具有1个属性的对象将占用更多内存。
如果它对任何人都有用,您可以从我的网站下载一个小型Java代理,用于查询对象的内存使用情况。它还可以让你查询“深层”内存使用情况。
程序的总已用/空闲内存可以在程序中通过
java.lang.Runtime.getRuntime();
运行时有几个与内存相关的方法。下面的代码示例演示了它的用法。
public class PerformanceTest {
private static final long MEGABYTE = 1024L * 1024L;
public static long bytesToMegabytes(long bytes) {
return bytes / MEGABYTE;
}
public static void main(String[] args) {
// I assume you will know how to create an object Person yourself...
List <Person> list = new ArrayList <Person> ();
for (int i = 0; i <= 100_000; i++) {
list.add(new Person("Jim", "Knopf"));
}
// Get the Java runtime
Runtime runtime = Runtime.getRuntime();
// Run the garbage collector
runtime.gc();
// Calculate the used memory
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Used memory is bytes: " + memory);
System.out.println("Used memory is megabytes: " + bytesToMegabytes(memory));
}
}
不,100个小对象比一个大对象需要更多的信息(内存)。
一个拥有100个属性的对象所消耗的内存空间是否与100个对象各有一个属性所消耗的内存空间相同?
No.
为一个对象分配了多少内存?
32位的开销是8字节,64位的是12字节;然后四舍五入为4字节(32位)或8字节(64位)的倍数。
添加属性时使用了多少额外空间?
属性范围从1字节(byte)到8字节(long/double),但引用是4字节还是8字节,这并不取决于它是32位还是64位,而是取决于-Xmx是否< 32Gb或>= 32Gb:典型的64位JVM有一个名为“-UseCompressedOops”的优化,如果堆低于32Gb,它会将引用压缩到4字节。