开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 27 天,点击查看活动详情
jvm方法区
前文
本文的主要内容主要是关于jvm方法区的相关知识。
jvm方法区
jvm一般情况下有五个组成部分,也就是堆、栈、本地方法栈、程序计数器以及方法区。以下内容将主要围绕jvm方法区的相关内容展开。
首先来看一下jvm方法区所在的位置,实际上根据jdk版本的不同,jvm方法区的位置也发生过变化。在jdk7及以前的版本,方法区是位于堆的永久代当中。而到了jdk8版本以后,方法区被转移到元空间当中。这两种位置的变化也意味着变化前,如果不设置永久代的大小,虚拟机也会提供一个默认值作为方法区大小的上限。而在jdk8版本及以后,方法区转移到元空间当中,此时如果不进行元空间大小的指定,会直接进行系统内存的消耗。也就是当空间不足时,甚至可能将系统内存全部耗尽。
那么方法区中一般会存储什么信息呢?首先会存储类的相关信息,包括类型信息、静态变量、方法信息、字段信息等等。其次还会存储运行时数据区,最后则是还会存储运行时常量池。而方法区的组成部分各内容的位置,也在不同的jdk版本中有所区别。在jdk6及以前的版本,方法区其实整体位于堆中的永久代,类信息位于方法区中,运行时常量池位于堆中,而字符串常量池还是运行时常量池的一部分。而到了jdk7的版本,运行时常量池和类信息仍然在永久代的堆中,但字符串常量池已经转移到常规的堆中并从运行时常量池中剥离。到了jdk8,虚拟机引入了元空间的概念,类的信息及运行时常量时继续存储在方法区也就是元空间中,而字符串常量池则是保持了jdk7的方案,保存在堆中。额外再补充一点,运行时常量池包含什么呢?它主要是包含了当类被编译成.class文件后,其中存储的常量内容会被存放在一块固定的区域中,也就是运行时常量池。
总结
本文主要是对于关于jvm方法区相关知识进行了总结,并对jvm方法区随着jdk版本的不同产生的变化进行了说明。