page contents

jvm方法区存的类信息问题

Pack 发布于 2020-02-08 18:11
阅读 456
收藏 0
分类:Java开发

jvm方法区问个问题,思考了好久,方法区存的类信息到底包含哪些东西,是指类的各个方法的指令集信息,还是一个类的初始化之后的信息;堆区newinstance一个类,是指将方法区的类copy一个放过去,还是只存放类的数据信息(像方法的成员变量数据,私有属性的地址信息等);类的方法执行,是线程先去方法区拿对应的方法指令集,再去对类的数据进行操作么

288
Pack
Pack

方法区存放的信息包括:
类的基本信息:
1.每个类的全限定名
2.每个类的直接超类的全限定名(可约束类型转换)
3.该类是类还是接口
4.该类型的访问修饰符
5.直接超接口的全限定名的有序列表

已装载类的详细信息
1.运行时常量池:在方法区中,每个类型都对应一个常量池,存放该类型所用到的所有常量,常量池中存储了诸如文字字符串、final变量值、类名和方法名常量。
2.字段信息:字段信息存放类中声明的每一个字段的信息,包括字段的名、类型、修饰符。
3.方法信息:类中声明的每一个方法的信息,包括方法名、返回值类型、参数类型、修饰符、异常、方法的字节码。
(在编译的时候,就已经将方法的局部变量、操作数栈大小等确定并存放在字节码中,在装载的时候,随着类一起装入方法区。)
4.静态变量:类变量,类的所有实例都共享,我们只需知道,在方法区有个静态区,静态区专门存放静态变量和静态块。
5.到类classloader的引用:到该类的类装载器的引用。
6.到类class 的引用:虚拟机为每一个被装载的类型创建一个class实例,用来代表这个被装载的类。

使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。
newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。

JVM方法调用可参考https://www.cnblogs.com/nyatom/p/9379013.html

请先 登录 后评论