首先,Perm空间和Heap空间有什么区别(JVM如何选择使用每个内存空间)?
其次,更重要的是,对于标准MVC类型的Java应用程序,推荐使用什么样的比例?
首先,Perm空间和Heap空间有什么区别(JVM如何选择使用每个内存空间)?
其次,更重要的是,对于标准MVC类型的Java应用程序,推荐使用什么样的比例?
就我个人而言,我不认为PermGen是堆的特殊部分。
我更愿意将堆视为专用于存储对象实例的内存区域,而将PermGen视为专用于存储类定义的区域。因此,堆的生命周期与应用程序相关联,而PermGen的生命周期则与JVM相关联。
一个很好的例子说明了应用程序及其JVM可以具有不同的生命周期,在Java EE容器中。在应用程序服务器中,应用程序可以在不重新启动服务器的情况下部署和取消部署。在取消部署(或重新部署)期间,释放所有对象实例(即堆空间)很容易,但是清除由该应用程序加载的所有类以释放PermGen则相对棘手,因为JVM仍可能引用其中一些类。
这种情况之一是泄漏的驱动程序。在部署应用程序时,将加载JDBC驱动程序并使用DriverManager进行注册。当卸载该应用程序时,DriverManager仍然存在,并保留对驱动程序、其原始类加载器以及该类加载器加载的所有内容的引用。因此,会在PermGen中创建内存泄漏,但这并不是应用程序中内存管理的错误。
的确,像JRocket这样的JVM根本没有PermGen,一切都存储在堆中。只有在这种情况下,您才可以将PermGen称为堆的“特殊部分”。即使在这种情况下,我们仍应将PermGen和堆视为不同的内容,因为它们具有非常不同的目的和非常不同类型的内存泄漏。
更新:在Oracle的JDK 8中,PermGen被替换为“Metaspace”,现在正式成为堆的一部分。我们不再需要专门调整PermGen。
在堆中分配的内存不能被命名。
这意味着 int x
(它的名称)是在堆栈中分配的。您可以通过其名称访问指针,因此指针位于堆栈中。您无法通过名称访问对象,因为它没有名称。必须通过指针访问(无名)对象。