方法区讲解

在这里插入图片描述
  栈、堆、方法区三者之间的关系如上图所示, 第一个Student代表类型,存放在方法区中, student 变量是在虚拟机栈中,最后 new 出来的Student对象放在堆中。本篇主要讲一下有关方法区中的知识。

文章目录

    • 概念
    • 方法区的内部结构
    • 方法区的变化

概念

  方法区是各个线程共享的运行时内存区域,它用来存储每一个类的结构信息,比如:运行时常量池、字段、方法数据、构造方法等。方法区是在虚拟机启动时就创建完成了,且在实际内存空间上不是连续的。虽然方法区在逻辑上属于堆的一部分(原因是二者在垃圾回收、内存分配上很相似),但实际上方法区是独立于java堆的内存空间,二者存放的内容是不一样的。需要注意的是:
  1、方法区与堆一样,是各个线程共享的内存区域。
  2、方法区在jvm启动的时候被创建,并且它实际的物理内存空间和虚拟机堆区一样都可以不是连续的。
  3、方法区的大小和堆空间一样,可以选择固定大小或者扩展,它的大小可以决定系统保存多少个类,如果系统定义了太多的类,会导致方法区oom。(加载大量的第三方jar包,tomcat部署的工程过多,大量动态地生成反射类。)

方法区的内部结构

  当java源代码编译成class文件,class文件被加载到运行时数据区后,class文件中的一部分信息会加载到方法区中,比如类class、接口interface、枚举enum以及运行时常量池等类型信息。
下面是方法区存放的一些内容:
一、类型信息
  当加载一个class时,方法区需存放下面内容:
  1、完整有效的类名,包括包名和类名。
  2、直接父类的完整有效名。
  3、访问修饰符(public、abstract)
  4、直接接口的列表

二、域信息
  域信息包括域名称、域类型、域修饰符。

三、方法信息
  1、方法名称
  2、方法的返回类型
  3、方法参数的数量和类型
  4、方法的访问修饰符
  5、方法的字节码、操作数栈深度、局部变量表大小。
  6、异常表

四、类变量和类常量
  类变量是static修饰的成员变量,它可以看成是和类一个级别的,随着类加载而加载,类变量被类的所有实例共享。在jdk7之前类变量也是方法区的一部分,jdk7以及以后放到了堆空间。用final static修饰的成员变量叫静态常量,静态常量和静态变量的区别是静态常量在编译期就已经为其赋值。

五、常量池和运行时常量池
  常量池(constant pool)是class 中的信息,当class 文件加载到内存中时,方法区会存放class文件的常量池信息,这时候常量池就变成了运行时常量池。
  一个java应用程序中所有java类的常量池组装成了jvm中最大的运行时常量池。常量池中包含数据类型有:数值、字符串值、类引用、字段引用、方法引用。
  常量池是class文件的一部分,用于存放编译期间生成的各种字面量和符号引用,这部分内容在类加载之后就放到了方法区中的运行时常量池内。
  虚拟机加载类或接口之后,就会创建对应的运行时常量池(也就是说每一个类有一个常量池,加载后对应一个运行时常量池)。之所以叫做运行时常量池,是因为它除了包含编译期间的常量,还包含运行时解析后获得的方法或字段引用。最常见的就是String 的intern()方法。

方法区的变化

  在jdk7及以前,习惯上把方法区称为永久代(因为里面的东西基本是不会变的,只有Full Gc的时候才会清除一下),在jdk8开始以及之后,方法区改名为元空间。永久代和元空间的本质类似,都是对jvm中方法区的实现,但是永久代和元空间最大的区别在于元空间不在虚拟机设置的内存中,而是在本地内存中。

  jdk6以及之前:存在永久代,静态变量在永久代中
  jdk7:存在永久代,但已经逐步去除永久代,字符串常量池、静态变量移除,保存在堆中
  jdk8以及以后:无永久代,取而代之的是元空间,字符串常量池、静态变量仍然在堆中。

jdk6的方法区:
在这里插入图片描述
jdk7的方法区:
在这里插入图片描述
  jdk7对字符串常量池的位置进行了调整,因为永久代的回收效率很低,只有在Full GC才会触发,导致字符串常量池回收效率不够高,我们创建的很多字符串并不需要永久保存,如果不回收的话,就会导致永久代内存不足,所以jdk7将字符串放到了堆中,内存就能及时回收利用。
移动静态变量的道理是一样的。

jdk8的方法区:
在这里插入图片描述
  jdk8中的永久代改名为元空间,通过名字可以看出里面放的是一些元数据,就是有关类相关的信息。它最大的好处是占用的是本地内存,并不是堆,从而减少了堆内存的占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.25世界白癜风日·成都博润白癜风医院获评“成都市医学重点专科”

夏日热情如江潮,勇攀高峰正当时。为激发新质生产力,驱动学术研究引领医院发展,也为了迎接 6.25 世界白癜风日。 6月22日,成都博润白癜风医院隆重举行成都市医学重点专科授牌新闻发布会暨成都市市级继续医学教育项目《难治性白癜风…

【招聘贴】JAVA后端·唯品会·BASE新加坡

作者|老夏(题图:公司业务介绍页) “ 请注意,这两个岗是BASE新加坡的,欢迎推荐给身边需要的朋友(特别是在新加坡的)。” VIP海外业务-产品技术团队,这两个岗位属于后端工程组的岗&…

每日待办事项提醒用什么便签app比较好?

在快节奏的现代生活中,我们经常需要记住各种事项,如会议、预约、购物清单等。这时,一个高效的便签App就显得尤为重要,可以帮助我们有效地管理日常任务和待办事项。而每日待办事项提醒用什么便签app比较好?面对市场上众…

C++程序设计基础实践:学生信息管理系统

目录 1 系统介绍 2 系统设计 3 设计结果 4 源代码 近来有空闲,把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正,有更好的方法也期待您的分享~ 实验要求 本课程要完成一个学生信息管理系统的设计与实现,可实现对于学生信息…

“三巫日”大结局:标普500尾盘成交量飙升,英伟达“过山车”终以下跌收盘

内容提要 隔夜“美股三巫日”,美国证券交易所迎来了180亿股的换手,较过去三个月的平均水平激增55%,标普500尾盘成交量比平日激增30%。在周五到期的5.5万亿美元各类证券衍生品里,与英伟达相关的衍生品合约价值高居第二&#xff0c…

upload-labs实验过程中遇到的问题

第6题问题:500异常码 发现500异常码,这个应该是apache版本问题,可更换其他版本,或者更换为nginx 12题问题:上传出错 出现上传错误,大概率是php版本问题,需要下载php5.2.17版本的php或者更换其他…

编程书籍的枯燥真相:你也有同样的感受吗?

讲动人的故事,写懂人的代码 我得实话实说,你可能已经发现市面上的大部分编程入门书籍有些枯燥。这个问题的根源在于许多作者把本应该充满乐趣和吸引力的入门指南,写得就像一本沉闷的参考手册。这就好比把一本充满冒险和乐趣的旅行日记,写成了一本单调乏味的字典。 我完全理…

开放式耳机有什么好处?推荐几款开放式蓝牙耳机

现在开放式蓝牙耳机面市,迅速占领了市场一席之地后。各大品牌商纷纷参与研制,开放蓝牙耳机与的竞争日趋激烈。这种开放式耳机崛起的速度,连我作为一个数码博主都得感叹一句绝了,所以我花了大几千块,又买了现在很热门的五款开放式耳机,这篇收集…

揭秘古代手术工具与技术:从中国起源的医疗奇迹

在人类历史的长河中,医学的发展一直是推动社会进步的重要力量。而手术作为医学的一个重要分支,其发展历程同样充满了传奇色彩。今天,我们将带您走进古代手术的世界,揭秘那些令人惊叹的手术工具和技术。 这把手术刀出土于河北西村遗…

【SkiaSharp绘图09】SKBitmap属性详解

文章目录 SKBitmap与Bitmap性能对比对比结果 构造函数SKBitmap()SKBitmap(SKImageInfo)SKBitmap(Int32, Int32, SKColorType, SKAlphaType, SKColorSpace) SKBitmap属性AlphaTypeByteCountBytesBytesPerPixelColorSpaceColorTypeDrawsNothingInfoIsEmptyIsImmutableIsNullPixel…

“脏读”、“幻读”、“不可重复读”

“脏读”、“幻读”、“不可重复读” 1.概念说明 “脏读”、“幻读”、“不可重复读”是数据库事务的概念。 “脏读”是指一个事务中访问到了另外一个事务未提交的数据。 “不可重复读”是指在一个事务内根据同一个条件对数据进行多次查询,但是结果却不一致&…

C++ Vector的模拟实现

vector的介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而…

人形机器人背后的关键技术之一:人体姿态估计WHAM与手势估计HaMeR

前言 本文一开始是属于此文的,但由于人体姿态估计WHAM与手势估计HaMeR比较重要,故导致越写越长,故独立抽取出来成为本文了 第一部分 姿态估计之 WHAM 1.1 WHAM的整体架构 根据arXiv的记录,此篇论文WHAM: Reconstructing World-…

Apple - Advanced Memory Management Programming Guide 内存管理

翻译整理自:Advanced Memory Management Programming Guide(Updated: 2012-07-17 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011i 文章目录 一、关于…

异步FIFO

目录 描述 输入描述: 输出描述: 参考代码 描述 请根据题目中给出的双口RAM代码和接口描述,实现异步FIFO,要求FIFO位宽和深度参数化可配置。 电路的接口如下图所示。 双口RAM端口说明: 端口名 I/O 描述 wclk i…

LQR 控制算法应用分析

参考 Optimization Based Control 从基础到复杂地介绍最优控制理论 麻省理工大学机器人算法第八章 LQR 大概说了 lqr 的推导过程,主页有更多算法介绍 wiki LQR 控制器 LQR 多种公式说明 Formulas for discrete time LQR, LQG, LEQG and minimax LQG optimal con…

Springboot项目ES报异常query_shard_exception

详细异常信息如下: {"error": {"root_cause": [{"type": "query_shard_exception","reason": "failed to create query: {\n \"bool\" : {\n \"filter\" : [\n {\n \…

换电脑后导入git本地仓库记录

导入本地仓库tig记录 换了新电脑,将旧电脑的数据盘查到新的笔记本之后发现,使用pycharm 读取不到本地的git提交记录了,我没有将本地git上传到远程仓库的习惯,这可抓马了,硬盘插回去的话也太麻烦了。试了 vscode 提示设…

Vue77-编程式路由

一、需求 不写<router-link>实行路由的跳转。 因为<router-link>的本质是<a>&#xff0c;但是&#xff0c;有时&#xff0c;导航不一定是a标签&#xff01;或者&#xff0c;有时需要等一段时间&#xff0c;页面才跳转。 二、代码实现 三、小结

Wakelocks 框架设计与实现

Wakelocks 框架是基于Wakeup Source实现的为Android系统上层提供投票机制&#xff0c;以阻止系统进入休眠。 1.功能说明 该模块的支持受宏CONFIG_PM_WAKELOCKS控制。在使能该宏的情况下&#xff0c;PM Core初始化过程中会在sysfs下创建两个属性节点&#xff1a; /sys/power/w…