译自 http://karunsubramanian.com/websphere/one-important-change-in-memory-management-in-java-8/ 转载请声明。
Oracle最新版Java - Java 8于2014年3月发布。与往常一样,新增了大量新功能。内存管理领域有一个重大的变化,我想今天讨论。
“再见永久代,你好元空间!!”
Oracle已经完全摆脱了永久代(PermGen),并用元空间(Metaspace)取而代之。
什么是永久代?
永久代的简写形式,永久代是JVM用来存储类和方法对象在堆中的内存区域。如果你的应用程序加载了很多类,永久代的利用率会很高。 永久代也持有“interned”字符串
永久代空间的大小由Java命令行选项-XX:MaxPermSize进行配置
对于大多数应用程序来说,通常256 MB应该是足够的PermGen空间
但是,如果您正在加载异常数量的类,则看到错误“java.lang.OutOfMemoryError:PermGen space”并不是不常见的。
由于永久代空间,OutOfMemory错误的日子已经一去不复返了。在Java 8中,没有永久代。那就对了。所以没有更多的由于永久代的OutOfMemory错误
永久代和元空间之间的主要区别在于:虽然永久代是Java堆(由-Xmx选项配置的最大大小)的一部分,但元空间不是堆的一部分。而元空间是本机内存(进程内存)的一部分,它只受主机操作系统的限制。
Java8堆
那么,这个改变的意义呢?
虽然不会再使用永久代空间(因为没有永久代),但是您可能会消耗过多的本机内存,从而使总体进程规模变大。问题是,如果您的应用程序加载了大量的类(和/或interned字符串),您可能会实际上关闭整个服务器(不只是您的应用程序)。为什么?由于本机内存仅受操作系统的限制。这意味着您可以从字面上占用服务器上的所有内存。不好。
添加新选项-XX:MaxMetaspaceSize可为您的应用程序设置最大元数据空间大小,这一点至关重要。
请注意,仅监视堆大小已经不够了。您还必须通过使用操作系统实用程序(例如:Unix / Linux中的'top',Windows中的'Task Manager')来关注“进程大小”来监视元空间。
一个有用的小提示:
您可以使用jmap命令输出当前的Java 8应用程序的内存统计信息。
jmap -permstat
你有它。在Java 8中,永久代不在了,而元空间在。元空间是本机内存的一部分,不是Java堆的一部分。虽然这种改变在应用程序的开发阶段可能并不重要,但在进行生产时考虑这一点非常重要,因为如果您的应用程序吃掉了过多的元空间,您可能不仅会降低应用程序的性能,还会导致整个服务器无法运行。
确保应用程序管理员和QA了解这一重大变化,并确保在QA阶段(负载测试)和生产过程中进行充分的监控。
领取专属 10元无门槛券
私享最新 技术干货