JVM学习笔记——方法区
方法区 Method Area
方法区在逻辑上属于堆的一部分,但可以看做是一块独立于 Java 堆的内存空间。所有的字段和方法字节码,以及一些特殊的方法,如构造函数,接口代码在此定义。所有定义方法的信息都保存在方法区。在 JDK 8 之后,方法区移动至本地内存中。
方法区具有以下特点:
方法区与 Java 堆一样,是各个线程共享的内存区域
方法区在 JVM 启动时创建完成,并且实际内存区域和 Java 堆区一样都可以是不连续的
方法区的大小,跟堆空间大小一样,可以选择固定大小或者可扩展
方法区的大小决定了系统可以保存多少类,在 JDK8 之后方法区溢出报错改为 OutOfMemoryError:Metaspace
关闭 JVM 后方法区就被释放
方法区内部结构
静态变量,常量,类信息,运行时常量池存在方法区中。实例变量存在堆中,与方法区无关。
类型信息
对每个加载的类型(类class,接口interface,枚举enum,注解annotation),在方法区存储以下信息:
类型的完整有效名称,全限定名
类型直接父类的全限定名
类型的修饰符(public,abstract,final 的子集)
类型直接接口的一个有序表
域(Field)信息(属性、字段)
所有域的相关信息以及域的声明顺序
域名称,域类型,域修饰符(public,private,protected,static,final,volatile,transient 的子集)
方法信息
声明顺序
方法名称
方法的返回值类型
方法参数的属性,类型,顺序
方法修饰符(public,private,protected,static,final,synchronized,native,abstract的子集)
常量池
Java 中的常量池分为静态常量池和运行时常量池。
静态常量池
即.class 文件中的常量池,class 文件中的常量池包含字符串(数字)字面量,类、方法的信息,占用class文件绝大部分空间。
运行时常量池
JVM 虚拟机在完成类装载后,将 class 文件中的常量池载入到内存中,并保存在方法区中,这就是运行时常量池
常量池表(Constant Pool Table)是 Class 文件的一部分,用于存放编译期间生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中
HotSpot 中的方法区
JDK 7 之前习惯吧方法区称为永久代,JDK 8 后废除永久代的概念,把方法区改为和 JRocket、J9 一样的元空间(MetaSpace),并调整了方法区的内部结构,如将字符串常量由永久代转移到堆中
元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制
字符串常量由永久代转移到堆中,是由于字符串存在永久代中,容易出现性能问题和内存溢出。
类的静态变量(class statics)转移到了堆。类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
设置方法区/元空间的内存大小
JDK 8 之后,元空间可以使用
-XX:MetaspaceSize:设置初始空间大小,到达该值就会触发垃圾收集,同时 GC 会对该值进行调整,windows 下,该值初始默认为 21M,无上限-XX:MetaspaceSize:用于设置最大空间,无限制-XX:MinMetaspaceFreeRatio:GC之后,最小的 Metaspace 剩余空间容量的百分比,减少为分配空间所导致的垃圾收集-XX:MaxMetaspaceFreeRatio:GC之后,最大的 Metaspace 剩余空间容量的百分比,减少为释放空间所导致的垃圾收集
JVM学习笔记——方法区的更多相关文章
- JVM学习笔记:虚拟机的类加载机制
JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- java之jvm学习笔记十三(jvm基本结构)
java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...
- JVM学习笔记-JVM模型
JVM学习笔记 == 标签(空格分隔): jvm 学习笔记全部来自于<深入理解java虚拟机>总结 jvm内存示意图 虚拟机栈(Java Virtual Machine Stacks): ...
- 【Java虚拟机】JVM学习笔记之GC
JVM学习笔记二之GC GC即垃圾回收,在C++中垃圾回收由程序员自己来做,例如可以用free和delete来回收对象.而在Java中,JVM替程序员来执行垃圾回收的工作,下面看看GC的详细原理和执行 ...
- JVM学习笔记-第三章-垃圾收集器与内存分配策略
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...
- JVM学习笔记-第七章-虚拟机类加载机制
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...
- JVM学习笔记——内存结构篇
JVM学习笔记--内存结构篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分 我们会分为以下几部分进行介绍: JVM整体介绍 程序计数器 虚拟机栈 本地方法栈 堆 方法 ...
随机推荐
- java 日期格式化-- SimpleDateFormat 的使用。字符串转日期,日期转字符串
日期和时间格式由 日期和时间模式字符串 指定.在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可以使用单引 ...
- Docker容器 关于镜像构建的安全问题
写在前面 确保容器中服务与应用安全是容器化演进的关键点.容器安全涉及到应用开发与维护的整个生命周期,本文主要从镜像构建的视角来看docker容器的一些安全问题及应对措施. 一.权限管理 1.避免以容器 ...
- tensorflow1.12 queue 笔记
主要参考:https://www.tensorflow.org/api_guides/python/threading_and_queues#Queue_usage_overview 自动方式 For ...
- configparser读
#-*-coding:utf-8-*-__author__ = "logan.xu"import configparserconf = configparser.ConfigPar ...
- 操作系统IO之零拷贝技术
磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝.直接 I/O.异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统 ...
- CSP 2021 游记
\(\text{Day -INF}\) 看见了 \(\text{SCP2021}\) 的报名通知,想着应该教练会让我们统一报名,就没放在心上 然后-- 然后过了二十多天教练根本没有提报名的事情,搞得我 ...
- Nginx:无处不在的Nginx的八个应用场景与配置
--- 阅读时间约 15 分钟 --- Nginx概述 众所周知,互联网已经离不开 WEB服务器 ,技术领域中 WEB服务器 不止 Nginx 一个,其他还有很多如 Apache . ...
- python库--jieba(中文分词)
import jieba 精确模式,试图将句子最精确地切开,适合文本分析:全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义:搜索引擎模式,在精确模式的基础上,对长词再次切 ...
- sort-uniq-tr-cut命令 对文件处理相关操作
目录: 一.sort命令 二.uniq命令 三.tr命令 四.cut命令 五.eval命令 一.sort命令 以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序 语法格式 sort [选项] ...
- [ Skill ] Cadence Skill 语言入门
https://www.cnblogs.com/yeungchie/ 写个大笔记,低速更新中 ... Cadence Skill Cadence 提供二次开发的 SKILL 语言,它是一种基于通用人工 ...