在Java中加载类时如何管理内存?
想象一下,我有10个方法的类,我需要从类中实例化10个对象。 问题是: 在创建对象时,JVM会为10个实例分配10个不同的内存空间(我的意思是在我调用构造函数的时候,例如new MyClass();或者它将在调用内存时调用一次类定义,这10种方法中的每一种,在运行时,JVM都会分配内存?
为了消除一些误解,我的问题是在创建一个对象时,我知道所有的数据成员都是在堆内存中分配的,但我不确定尚未调用的方法是否在内存中分配给每个对象,或者不?
JVM会在创建对象时为10个实例分配10个不同的内存空间(我的意思是在我调用构造函数的时候,例如new MyClass();
它可以做,但是通过逃逸分析,它可以将它们放在堆栈上或完全消除它们。
或者它将在运行时调用这10个方法中的每一个的同时在内存和每个实例中加载类定义一次,JVM将分配内存?
如果你有一个ClassLoader,你将得到这个类的一个实例,但是如果每个实例都有它自己的ClassLoader,你将在每个ClassLoader中得到一个类的副本。 注意:每个ClassLoader可以具有相同名称的类的不同版本。
为了清除一些误解,我的问题是在创建对象时,我知道所有数据成员都分配在堆内存中,
它存储在PermGen(Java <7)或MetaSpace(Java 8+)的堆中的类和方法信息(包括字节代码)
实际的实例被理论上添加到堆中,但不一定是。
我不确定尚未调用的方法是否在内存中为每个对象分配的方式不同?
JVM经历了许多优化阶段,当你调用一个方法时,它可能会优化它,内联它甚至消除它。 您可以通过在命令行中添加-XX:+PrintCompilation
来查看正在编译的方法(甚至可以重新优化)。
是。 Class Metadata被加载到Permgen空间(Java8中的MetaSpace)。 所以,一旦加载了类,所有方法都可用(静态和非静态)。 尚未调用的方法也将作为此元数据的一部分加载。 所有方法将只加载一次。
当类正在加载时,类的所有方法(静态和非静态)也加载到内存中。 没关系,有多少人正在加载。
对于每个对象,JVM都会分配不同的内存位置。
假设
MyClass m1 = new MyClass(); // one memory location
MyClass m2 = new MyClass(); // different location
MyClass m3 = m1; // same memory location of m1 object
链接地址: http://www.djcxy.com/p/85503.html
上一篇: How is memory managed while loading classes in Java?
下一篇: Meteor: How to assign different roles to users during sign up process