Java运行时数据区域
Java运行时数据区分为线程共享区域和线程私有区域。线程共享区域随着虚拟机进程生命周期启动和消亡,线程私有区域依赖用户线程的启动和结束而建立和销毁。线程共享区域包括:方法区和堆;线程私有区域包括:栈、本地方法区和程序计数器。如下图所示:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html
关于元空间需要注意的是,元空间会自动扩容,默认情况下不受限制,在实际中,经常忽略掉直接内存,使得各个内存区域总和大于物理内存限制,从而导致动态扩展时出现OutOfMemoryError异常。
为什么要废弃永久代?
官网给出了解释:http://openjdk.java.net/jeps/122
This is part of the JRockit and Hotspot convergence effort. JRockit customers do not
need to configure the permanent generation (since JRockit does not have a permanent
generation) and are accustomed to not configuring the permanent generation.
移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。