彼尔姆空间vs堆空间

首先,Perm空间和Heap空间有什么区别(JVMselect使用每个内存空间的方式和方式)?

其次,但是最重要的是,对于一个标准的MVCtypes的java应用程序,推荐什么样的比例呢?

存储由Java程序创build的所有对象。 堆的内容由垃圾收集器监视,当你停止使用一个对象时(即,当没有对该对象的更多引用时,它从堆中释放内存)。

这与存储原始types(如int和chars)的堆栈相反,通常是局部variables和函数返回值。 这些不是垃圾收集。

烫发空间是指堆的特殊部分。 看到这个答案的解释: 什么是烫发空间?

就我个人而言,我不会认为PermGen是堆的特殊部分。

我更喜欢把堆作为专用于存储对象实例的内存区域,而将PermGen作为专用于存储类定义的区域。 因此,堆的生命周期与应用程序绑定,而PermGen的生命周期与JVM绑定。

为什么应用程序及其JVM可能具有不同的生命周期的最好的例子之一是在Java EE容器中。 在应用程序服务器中,可以在不重新启动服务器的情况下部署和取消部署应用程序。 在取消部署(或重新部署)期间,很容易释放所有对象实例(即堆空间),但是要清除PermGen中由该应用程序加载的所有类是相当棘手的,因为某些类仍然可以被JVM引用。

其中一个案例是泄漏的司机 。 部署应用程序时,会加载一个JDBC驱动程序并使用DriverManager进行注册。 当这个应用程序被取消部署时,DriverManager保留并保存对驱动程序,其原始类加载器以及此类加载器加载的所有内容的引用。 因此,创build了PermGen中的内存泄漏,但这不是应用程序内存pipe理的问题。

确实像JRocket这样的JVM完全没有PermGen,一切都存储在堆中。 只有在这种情况下,你才能把PermGen称为堆的“特殊部分”。 即使如此,我们仍然应该以不同的方式来看待PermGen和堆,因为它们具有非常不同的目的,并且它们具有非常不同的内存泄漏types。

更新 :在Oracle的JDK 8中,PermGen被“Metaspace”取代,现在它正式成为堆的一部分。 我们不需要特别调整PermGen。

您不能将名称分配给堆中分配的内存。

这意味着int x (它的名字)被分配在堆栈中。 你可以通过它的名字到达指针,所以指针在堆栈中。 你不能通过它的名字到达对象,因为它没有名字。 接受(无名)对象必须由它的指针。