首先,Perm空间和Heap空间之间的区别是什么( JVM选择什么以及如何使用每个内存空间)?
其次,但最重要的是,对于标准的MVC类型的java应用程序,推荐的比率是什么?
发布于 2011-01-31 15:58:07
Java 存储您的程序创建的所有对象。堆的内容由垃圾收集器监视,当您停止使用对象时(即,当不再有对该对象的引用时),垃圾收集器将从堆中释放内存。
这与堆栈形成对比,后者存储in和chars等原始类型,并且通常是局部变量和函数返回值。这些不是垃圾回收。
perm空间引用堆的一个特殊部分。请参阅此SO答案以获取解释:What is perm space?
发布于 2013-06-03 11:13:19
就我个人而言,我不认为PermGen是堆中的一个特殊部分。
我更倾向于将堆看作专用于存储对象实例的内存区,而将PermGen看作专用于存储类定义的内存区。因此,堆的生命周期绑定到应用程序,而PermGen的生命周期绑定到JVM。
为什么应用程序及其JVM可以具有不同的生命周期,最好的例子之一是在Java容器中。在应用程序服务器中,无需重启服务器即可部署和取消部署应用程序。在取消部署(或重新部署)期间,很容易释放所有对象实例,即堆空间,但要清除此应用程序从PermGen加载的所有类却相当棘手,因为其中一些类仍然可以被JVM引用。
Leaking Drivers就是这样一种情况。在部署应用程序时,会加载一个JDBC驱动程序并向DriverManager注册。当取消部署此应用程序时,DriverManager将继续存在,并保留对驱动程序、其原始类加载器以及此类加载器加载的所有内容的引用。因此,在PermGen中产生了内存泄漏,但这不是应用程序内存管理的错误。
确实,像JRocket这样的JVM根本没有PermGen,所有的东西都存储在堆中。只有在这样的上下文中,您才能将PermGen称为堆的“特殊部分”。即使这样,我们仍然应该以不同的方式看待PermGen和堆,因为它们有非常不同的目的,并且它们有非常不同的内存泄漏类型。
更新:在OracleJDK8中,PermGen是replaced by "Metaspace",它现在正式成为堆的一部分。我们将不再需要专门调优PermGen。
发布于 2016-01-29 20:14:57
您不能为堆中已分配的内存命名。
这意味着在堆栈中分配了int x (其名称)。您可以通过指针的名称到达指针,因此指针在堆栈中。你不能通过它的名字来访问对象,因为它没有名字。对(无名)对象的访问必须通过它的指针。
https://stackoverflow.com/questions/4848669
复制相似问题