方法区 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. Python创建二维列表的正确姿势

    Python创建二维列表的正确姿势 简介 Python中没有数组,使用list结构代替,并且list结构的功能更加强大: 支持动态扩容,无需担心元素过量 对list内的元素类型不做一致性约束 提供丰富 ...

  2. playwright-python 元素定位、frame处理(一)

    浏览器.Browser contexts.frame Playwright 可以同时启动多个浏览器(chromium.Firefox.webkit),每个浏览器可以启动多个page(在Playwrig ...

  3. ROS catkin_make error Could not find a package configuration file provided by "actionlib_msgs"

    在使用ROS catkin_make编译的时候,出现类似如下错误 CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cma ...

  4. Appium问题解决方案(8)- selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not sign with default certificate.

    背景 运行时代码报错: selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occ ...

  5. 《微服务架构设计模式》读书笔记 | 第8章 外部API模式

    目录 前言 1. 外部API的设计难题 1.1 FTGO应用程序的服务及客户端 1.2 FTGO移动客户端API的设计难题 1.3 其他类型客户端API的设计难题与特点 2. API Gateway模 ...

  6. TypeScript 中装饰器的理解?应用场景?

    一.是什么 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上 是一种在不改变原类和使用继承的情况下,动态地扩展对象功能 同样的,本质也不是什么高大上的结构,就是一个普通的 ...

  7. Powershell配合word伪装木马执行

    环境: win7 64位,word2013 生成木马 msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.64.135 LPOR ...

  8. 跨 Docker 宿主机网络 overlay 类型

    跨 Docker 宿主机网络 overlay 类型 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 三台 CentOS 7.0 虚拟机 (Vmware Workstation 1 ...

  9. 通过Wireshark抓包分析谈谈DNS域名解析的那些事儿

    文/朱季谦 本文主要想通过动手实际分析一下是如何通过DNS服务器来解析域名获取对应IP地址的,毕竟,纸上得来终觉浅,绝知此事要躬行. 域名与IP地址 当在浏览器上敲下"www.baidu.c ...

  10. VBox 虚拟机安装 Openwrt 做旁路由

    VBox 虚拟机安装 Openwrt 做旁路由 需求:开个虚拟机做旁路由,电脑把网关设置成旁路由地址,用它跑个上网或其他什么东西. 安装及配置过程简述 这件事流程很简单,总结起来主要有以下几点: 安装 ...