java中对象的内存分配

时间:2015-06-27 19:37:31

标签: java memory methods members

我是Java的初学者,我已经完成了C ++。 在C ++中,成员函数的内存分配是在它们被声明为类的一部分时完成的,而不是在创建对象时,在创建对象时,只有实例变量的内存分配是完成后,对于每个对象,实例变量的内存分配单独完成,成员函数由所有对象共同共享。 在实例变量的情况下,我知道在java中会发生相同的情况,但是在成员函数的情况下会发生什么?

在C ++中; 对于例如如果我们有2个实例变量a和b,并且我们创建了3个对象x,y,z,让我们说我们有一个成员函数getData(), 然后所有3个对象都有两个实例变量a和b的单独副本,但共享getData()的公共副本。

例如变量,java中的情况相同,但成员函数是什么?

2 个答案:

答案 0 :(得分:2)

在Java中,方法的字节码只对类存在一次;没有为每个对象制作方法的字节码的副本。这将是不必要和浪费的;程序运行时字节码不会改变。

因此它与您对C ++的说法相同:

  

...成员函数通常由所有对象共享。

答案 1 :(得分:0)

在Java中,成员函数由classloader按需加载。由于整个Java标准库可以与任何Java程序一起使用,并且程序本身可以包含任意数量的类,因此为了使程序启动时间保持在理智范围内,这是必要的。

因此,只要程序需要以任何方式使用类(例如,访问静态变量或方法,或创建对象的实例),并且尚未加载,Java类加载器就会加载该类,包括班级的成员职能。然后,一旦加载了该类,如果将来需要它,则不需要再次加载,因为与您在问题中注意到的类似,只需要一个类字节码的副本任何给定的时间。

为避免在程序运行时累积越来越多的已加载类,Java使用垃圾收集来卸载它知道可以安全卸载的类,类似于它如何使用垃圾收集来处理程序数据。如果再次需要这些类,当然可以在以后重新加载。当然,由于重新加载它会导致静态变量/代码重新初始化/运行的风险,卸载类不会起作用的情况。

这种卸载和重载类的能力也可用于调试:IntelliJ IDEA具有HotSwap功能,允许您在程序运行时编辑和重新编译类,卸载该类,然后重新加载新的字节码,以便您可以快速测试想法。 (哇,我刚刚意识到这完全听起来就像一则广告。如果你想知道的话,我与JetBrains没有任何联系。)

相关问题