【面向对象-04】方法区是什么、方法区存放什么

目录

一、方法区定义(Method Area)

二、方法区特点

三、方法区存放的内容

1.类型信息

2.类型的常量池( constant pool)

3.域信息

4.方法信息

5.类变量

6.对类加载器的引用

7.对Class类的引用

8.方法表


一、方法区定义(Method Area)

《深入理解JVM》书中描述如下:

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。

二、方法区特点

1.方法区是线程共享的,多个线程都用到一个类的时候,若这个类还未被加载,应该只有一个线程去加载类,其他线程等待;

2.方法区的大小可以是非固定的,jvm可以根据应用需要动态调整,jvm也支持用户和程序指定方法区的初始大小;

3.方法区有垃圾回收机制,一些类不再被使用则变为垃圾,需要进行垃圾清理。

三、方法区存放的内容

《深入理解JVM》书中描述如下:

它存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。

本文对存放内容画了粗图以便大家理解记忆,如下:

1.类型信息

对每个加载的类型,jvm必须在方法区中存储以下类型信息:
1.类型的完整有效名;
2.直接父类的完整有效名(除非当前类型是Interface 或 java.lang.Object,两者都没有父类);
3.类型的修饰符(public,abstract, final等);

总结来说就是一个类上户口,需要知道这个类的名字叫什么、父亲是谁、有没有实现接口、 权限是什么。

2.类型的常量池( constant pool)

已加载的类型(每一个class文件中),都维护着一个常量池(不同于方法区的运行时常量池),里面存放着编译时期生成的各种字面值(像string、基本数据类型、以及它们的包装类的值、及final修饰的变量,即在编译期间就确定下来的值)和符号引用(对类型、域、方法的引用);这个常量池的内容在类加载的时候,被复制到方法区的运行时常量池;池中的数据项类似数组项一样,是通过索引访问的。

3.域信息

类型的所有域的相关信息(域名、域类型、域修饰符如<public、private、protected>等),以及域的声明顺序;

4.方法信息

声明的顺序、修饰符、返回值类型、名字、参数列表(有序保存)、异常表(方法抛出的异常)、方法字节码(native、abstract方法除外)、操作数栈和局部变量表大小

5.类变量

jvm使用一个类之前,必须在方法区中为每个非final类变量分配空间,非final类变量存储在定义它的类中;

PS:final类变量不存储在这里,由于final的不可改变性,final类变量的值在编译期间就被确定了,因此保存在类的常量池里面,然后在加载类的时候,复制进方法区的运行时常量池里面,final类变量存储在运行时常量池里面,每一个使用它的类保存着一个对其的引用。

6.对类加载器的引用

jvm必须知道一个类型是由启动加载器加载的还是由用户类加载器加载的,如果一个类型是由用户类加载器加载的,那么jvm会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中。jvm在动态链接的时候需要这个信息,当解析一个类型到另一个类型的引用的时候,jvm需要保证这两个类型的类加载器是相同的,这对jvm区分名字空间的方式是至关重要的。

7.对Class类的引用

jvm为每个加载的类都创建一个java.lang.Class的实例(存储在堆上),而jvm必须以某种方式把Class的这个实例和存储在方法区中的类型数据(类的元数据)联系起来。

8.方法表

java语言始终是把安全放在首位,难免牺牲效率为代价的,为了提高应用效率jvm还添加了法表,jvm可以通过方法表快速激活实例方法。

JAVA基础篇专栏持续更新中,更多JAVA基础知识请移步专栏垂阅,希望对您有帮助!

  • 27
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
利用面向对象方法,实现贪吃蛇。 1. 利用面向对象的思想实现——一个食物对象、一个蛇对象、一个游戏总控对象。 2. 在使用××.prototype= {}重写原型对象的时候,一定要加上一句constructor:该对象。不然会造成实例化出来的实例的constructor为object。 3. 在underscore中,使用_.random(a,b)即可获得a-b中的一个随机数。 4. 在求食物的随机位置的时候,用到了panel.clientHeight/this.height - 1) * this.height。 原理是使用盒子的高度/小球的高度,可以算得最多放多少个小球。因为要控制小球不能超过边界,所以总数量要减去1,数量×高度即为随机位置的最大值。 5. 在蛇对象中,用body数组存放蛇身体每一个部分对象。蛇的绘制过程就是遍历body,在面板上绘制。 6. 蛇的移动分为两部分。 ① 蛇节移动到前一个蛇节的位置。直到蛇头后一个蛇节移动到蛇头的位置。 ② 根据direction判断蛇头如何移动。 注意:在游戏绘制的过程中,界面的每一次绘制都要**删除**之前的绘制,不然会叠加到一起。 7. 在蛇的闭包中建一个局部数组,存储蛇对象,可以更加方便的删除操作。 8. 只有在原型对象中的方法和属性,外界是可以调用的。 9. 蛇的移动(动画)必然需要定时器协助。定时器的时间,即象征着刷新速度,也就是难度。 10. this所在的函数在哪一个对象中,this就指向谁。单独写一个函数的时候,如果调用之前对象的this,需要备份指针(将对象的this赋值给另一个变量)。 11. JavaScript原生的键盘按下事件(keydown) 中,事件有一个keyCode属性,其值代表按下的键。其中:37—left、38—top、39—right、40—bottom。 12. 边界控制。通过判断蛇头与最大X和Y的关系,判断是否碰到边界。 13. confirm()方法用于显示一个带有指定消息和确认及取消按钮的对话框。 14. window.location.reload(); 重新加载当前文档 15. window.close() 方法用于关闭浏览器窗口。 16. 与食物的碰撞检测:如果蛇头和食物坐标重叠,将蛇尾添加到body中。并重新绘制一个食物点,将之前的食物删掉。
提供了一种组织和交互的方式,使得程序的功能可以通过对象之间的交互来实现。在Java面向对象编程中,对象是程序的基本单元,每个对象由数据和操作数据的方法组成。对象的数据表示对象的状态,而对象的方法表示对象的行为。通过定义类来创建对象,每个对象都会在内存中占有一定的空间,并可以通过对象名或对象地址来访问。对象指针是用于存放对象地址的变量。面向对象程序的主要结构特点是程序一般由类的定义和类的使用两部分组成,而程序中的操作都是通过向对象发送消息来实现的。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [什么是面向对象编程(Java)](https://blog.csdn.net/dica54dica/article/details/129625491)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)](https://blog.csdn.net/weixin_44368437/article/details/117563488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [面向对象程序设计概念](https://blog.csdn.net/kangjialong_/article/details/121107756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值