jdk1.8下jvm内存结构组成
前言
前面说了jvm的概念,不太理解的朋友可以看看我上一篇博客,不过jvm也是比较复杂的一个东西,想深入了解看一两篇文章是不够的,可以去看看《深入理解java虚拟机》,这里我带大家来康康jvm的内存结构,中间不乏字数较多熬,毕竟是概念性的东西,嘿嘿嘿
首先我们得知道,jvm运行时数据区域分为五大部分:堆,java虚拟机栈,本地方法区,程序计算器,方法区(jdk1.8版本后叫做元区间,在jdk1.8版本后位置移到了本地内存)。
不知道大家看到这五个名词第一反应是什么,但是我第一次看到我直接阿巴阿巴,这啥啊,都是干啥的啊,随后我找了一些资料,也有了一些了解。
堆*
堆:该区域是线程共享的,主要用于用于存放对象实例。绝大多数创建的对象都会被存放到这里(除了部分由于逃逸分析而在对外分配的对象,该部分只是在方法体被引用,故被分配到了栈上)。
堆这块区域也是jvm虚拟机中占用最大的,因为我们写项目会写很多类,它们都被放在堆里面,如果java堆空间不足了,程序会抛出OutOfMemoryError异常。因此也是垃圾回收的主要目标。
而堆也划分了几个区域:年轻代(young)、老年代(old)、永久区(permanent 对HotSpot虚拟机而言,JDK1.8之后为metaspace(元区间)替代永久代)。
永久代
JDK1.8之后为metaspace(元区间)替代永久代,它采用永久代的方式来实现方法区,其他的虚拟机实现没有这一概念,而且HotSpot也有取消永久代的趋势,在JDK 1.7中HotSpot已经开始了“去永久化”,把原本放在永久代的字符串常量池移出。永久代主要存放常量、类信息、静态变量等数据,与垃圾回收关系不大,新生代和老年代是垃圾回收的主要区域。
老年代
在新生代中经历了多次(具体看虚拟机配置的阀值)GC后