方法区 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学习笔记——方法区的更多相关文章

  1. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  2. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  3. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  4. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  5. JVM学习笔记-JVM模型

    JVM学习笔记 == 标签(空格分隔): jvm 学习笔记全部来自于<深入理解java虚拟机>总结 jvm内存示意图 虚拟机栈(Java Virtual Machine Stacks): ...

  6. 【Java虚拟机】JVM学习笔记之GC

    JVM学习笔记二之GC GC即垃圾回收,在C++中垃圾回收由程序员自己来做,例如可以用free和delete来回收对象.而在Java中,JVM替程序员来执行垃圾回收的工作,下面看看GC的详细原理和执行 ...

  7. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  8. JVM学习笔记-第七章-虚拟机类加载机制

    JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...

  9. JVM学习笔记——内存结构篇

    JVM学习笔记--内存结构篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分 我们会分为以下几部分进行介绍: JVM整体介绍 程序计数器 虚拟机栈 本地方法栈 堆 方法 ...

随机推荐

  1. HTML基本语法(慕课网学习笔记)

    标题 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  2. HbaseWAL

    1.WAL意为 Write Ahead Log ,类似MySQL中的binlog,用来做灾难恢复之用,HLog记录数据的所有变更,一旦数据修改,就可以从Log中进行恢复. Hbase采用类LSM的架构 ...

  3. SpringBoot笔记(1)

    一.Spring能做什么 微服务 响应式开发 分布式云开发 web开发 无服务开发(云) 批处理业务等 二.SpringBoot作用 能快速创建出生产级别的Spring应用 SpringBoot是整合 ...

  4. 小程序 mpvue page "xxx" has not been registered yet

    新增了几个页面,改了下目录结构,就开始报这个错. 重启了几次不管用,google 一番也无果. 灵机一动试一下 build npm run build build 版本没报错,OK 然后 $ rm - ...

  5. ELK数据迁移,ES快照备份迁移

    通过curl命令或者kibana快照备份,恢复的方式进行数据迁移 环境介绍 之前创建的ELK 因为VPC环境的问题,需要对ELK从新部署,但是还需要保留现有的数据,于是便有了这篇文档. 10.0.20 ...

  6. 使用Keepalived实现Nginx的自动重启及双主热备高可用

    1.概述 之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下. 1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服 ...

  7. go语言调用everything的SDK接口

    介绍 官方SDK地址 本项目会将官方dll编译到可执行程序中,运行时无需考虑dll问题. 根据官方介绍,使用SDK前需要运行everything程序. 执行go build -tag ASCII时编译 ...

  8. openswan协商流程之(二):main_inI1_outR1()

    主模式第二包:main_inI1_outR1() 文章目录 主模式第二包:main_inI1_outR1() 1. 序言 2. `main_inI1_outR1()`处理流程图 3. `main_in ...

  9. openswan中的in_struct和out_struct函数

    openswan中的in_struct和out_struct函数 文章目录 openswan中的in_struct和out_struct函数 1. 花絮 2. in_struct代码实现分析 3. 它 ...

  10. LVS+keepalived集群

    一.Keepalived工具介绍专为LVS和HA设计的一款健康检查工具 支持故障自动切换(Failover) 支持节点健康状态检查(Health Checking) 官方网站:http://www.k ...