JDK8之前的HotSpot JVM,存放着这些永久的的群与叫做“永久代(permanent generation)”。永久代的垃圾收集是和老年代(old generation)捆绑在一起,因为无论哪个内存满了,都会触发永久代和老年代的垃圾收集。当JVM加载的类信息容量超过了参数-XX:MaxPermSize设定的值时,应用将会报OOM的错误:java.lang.OutOfMemoryError:PermGen
JDK8的jvm不再有PermGen。但类的元数据信息(metadata)还在,只不过不再是存储在连续的非堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。
public static void main(String[] args){
List<String> list = new ArrayList<>();
while(true){
list.add(String.valueOf(System.currentTimeMillis()).intern());
}
}
java8de Metaspace容量默认情况下,Metaspace类元数据只受可用的本地内存限制(容量取决于32位或者64位操作系统的可用虚拟内存大小)。
新添加参数:-XX:MaxMetaspaceSize用于限制本地内存分配给类元数据的大小。如果没有指定这个参数,元空间会在运行时根据需要动态调整。
一般不会遇到这个情况,很少会主动去限制这个参数的大小。
java方法运行时,会创建栈帧,用户存储局部变量、操作数栈、动态链接。方法被调用到执行完成的过程,就是对应于栈帧在JVM从入栈的过程。当线程请求的栈深度大于虚拟机允许的最大深度就会出现StackOverflowError。
设置参数:-Xss128K
ulimeit -a 查看资源