简单的总结一下JVM的主要的框架结构
永久代是Hotspot虚拟机特有的概念,是方法区的一种实现,别的JVM都没有这个东西。在Java 8中,永久代被彻底移除,取而代之的是另一块与堆不相连的本地内存——元空间。
永久代或者“Perm Gen”包含了JVM需要的应用元数据,这些元数据描述了在应用里使用的类和方法。注意,永久代不是Java堆内存的一部分。永久代存放JVM运行时使用的类。永久代同样包含了Java SE库的类和方法。永久代的对象在full GC时进行垃圾收集。
Eden Space:堆内存池,大多数对象在这里分配内存空间。
Survivor Space:堆内存池,存储在Ede Space的gc中存活下来的对象。
Tenured Generation:堆内存池,存储SurvivorSpace中存活几次gc对象。
Code Cache:非真堆空间,JVM用来存储编译和存储native code.
虚拟机栈是线程隔离的,即每个线程都有自己独立的虚拟机栈。
JVM会为每个线程的虚拟机栈分配一定的内存大小(-Xss参数),若单个线程请求的栈深度大于虚拟机允许的深度,则会抛出StackOverflowError(栈溢出错误)
本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛StackOverflowError和OutOfMemoryError异常,不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。
JDK8正式去除"永久代",换成Metaspace(元空间)作为JVM虚拟机规范中方法区的实现。
元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但仍可以通过参数控制:-XX:MetaspaceSize与-XX:MaxMetaspaceSize来控制大小。
网友评论