方法区 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. Spring parent 属性

    Spring Framework Reference Documentation 6.7. Bean definition inheritance 注:本文中bean和definition意思等同 该 ...

  2. GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组

    1 drop table orders; 2 create table orders ( 3 o_id int auto_increment primary key, 4 orderdate date ...

  3. vue3.0入门(三)

    前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 class绑定 对象绑定 :class='{active:isActive}' // 相当于class="active&q ...

  4. 前端性能优化(四)——网页加载更快的N种方式

    网站前端的用户体验,决定了用户是否想要继续使用网站以及网站的其他功能,网站的用户体验佳,可留住更多的用户.除此之外,前端优化得好,还可以为企业节约成本.那么我们应该如何对我们前端的页面进行性能优化呢? ...

  5. noip模拟44

    A. Emotional Flutter 直接将所有黑块平移到 \([1-k,0]\) 的区间即可,然后找有没有没被覆盖过的整点 注意特判 \(1-k\) 以及 \(0\) 的可行性,考场这里写挂成 ...

  6. Easy-ARM IMX283 移植RTL8192CU驱动

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 无线网卡驱动下载地址:http://www.comfast ...

  7. Python 高级特性(3)- 列表生成式

    range() 函数 日常工作中,range() 应该非常熟悉了,它可以生成一个迭代对象,然后可以使用 list() 将它转成一个 list # 判断是不是迭代对象 print(isinstance( ...

  8. 最全Windows版本jemalloc库(5.2.1)及其使用:包含动态库和静态库、x86版本和x64版本、debug版本和release版本

    编写服务器程序时,需要频繁的申请和释放内存,长时间运行会产生大量的内存碎片,这就导致即使当前系统中的闲置内存还足够多,但也无法申请到大的连续可用的内存块,因为此时的物理内存已经千疮百孔像个马蜂窝.此外 ...

  9. 多选Combobox的实现(适合MVVM模式)

    MVVM没有.cs后台逻辑,一般依靠command驱动逻辑及通过binding(vm层的属性)来显示前端 我的数据类Student有三个属性int StuId ,string StuName ,boo ...

  10. 织梦Call to a member function GetInnerText() on string

    "include"-"customfields.func.php"文件,在第539行中把以下代码: $fvalue = trim($ntag->GetIn ...