精华内容
下载资源
问答
  • 一、方法区定义 在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中,类型信息是由类加载器在类加载时从类文件中提取出来的,类(静态)变量也存储在方法区中。 二、方法区特点 1.方法区是线程...

    目录

    一、方法区定义(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基础知识请移步专栏垂阅,希望对您有帮助!

    展开全文
  • Java方法区存的是什么方法区在堆中吗?最近一直被方法区里面存着什么东西困扰着,为了解开这个谜题,我查阅了大量资料,总算是解开了心里的那把锁,下面就将java方法区这一概念细数一下。Java方法区存的是什么样的...

    Java方法区存的是什么?方法区在堆中吗?最近一直被方法区里面存着什么东西困扰着,为了解开这个谜题,我查阅了大量资料,总算是解开了心里的那把锁,下面就将java方法区这一概念细数一下。

    Java方法区存的是什么样的东西?

    1.方法区里存class文件信息和class文件常量池是个什么关系。

    2.class文件常量池和运行时常量池是什么关系。

    方法区存着类的信息,常量和静态变量,即类被编译后的数据。这个说法其实是没问题的,只是太笼统了。更加详细一点的说法是方法区里存放着类的版本,字段,方法,接口和常量池。常量池里存储着字面量和符号引用。

    符号引用包括:1.类的全限定名,2.字段名和属性,3.方法名和属性。

    下面一张图是我画的方法区,class文件信息,class文件常量池和运行时常量池的关系

    ad91a0fbc7cc22aee3635ddb8cccb309.png

    下面一张图用来表示方法区class文件信息包括哪些内容:

    cce7a77f182c852cf405f418849bd8d8.png

    可以看到在方法区里的class文件信息包括:魔数,版本号,常量池,类,父类和接口数组,字段,方法等信息,其实类里面又包括字段和方法的信息。

    下面的图表是class文件中存储的数据类型

    类型

    名称

    数量

    u4

    magic

    1

    u2

    minor_version

    1

    u2

    major_version

    1

    u2

    constant_pool_count

    1

    cp_info

    constant_pool

    constant_pool_count - 1

    u2

    access_flags

    1

    u2

    this_class

    1

    u2

    super_class

    1

    u2

    interfaces_count

    1

    u2

    interfaces

    interfaces_count

    u2

    fields_count

    1

    field_info

    fields

    fields_count

    u2

    methods_count

    1

    method_info

    methods

    methods_count

    u2

    attribute_count

    1

    attribute_info

    attributes

    attributes_count

    下面用一张图来表示常量池里存储的内容:

    89d6b51e8b5b04f1d9878a7b46f1fc29.png

    用一个class文件实际反编译一下

    下面是原java代码

    3d1807fc06c1d4e38c7b83e90a9f4b6d.png

    经过反编译后获得class文件是下面这样的

    5f6de7811dcb091fc0a828bdadcadeb0.png

    可以看出被反编译的class文件中的内容和上面所说的是能对应上的。这就解答了class文件和静态常量池(class文件常量池)的关系

    静态常量池和动态常量池的关系以及区别

    静态常量池存储的是当class文件被java虚拟机加载进来后存放在方法区的一些字面量和符号引用,字面量包括字符串,基本类型的常量,符号引用其实引用的就是常量池里面的字符串,但符号引用不是直接存储字符串,而是存储字符串在常量池里的索引。

    动态常量池是当class文件被加载完成后,java虚拟机会将静态常量池里的内容转移到动态常量池里,在静态常量池的符号引用有一部分是会被转变为直接引用的,比如说类的静态方法或私有方法,实例构造方法,父类方法,这是因为这些方法不能被重写其他版本,所以能在加载的时候就可以将符号引用转变为直接引用,而其他的一些方法是在这个方法被第一次调用的时候才会将符号引用转变为直接引用的。

    方法区在堆中吗?

    方法区里存储着class文件的信息和动态常量池,class文件的信息包括类信息和静态常量池。可以将类的信息是对class文件内容的一个框架,里面具体的内容通过常量池来存储。

    动态常量池里的内容除了是静态常量池里的内容外,还将静态常量池里的符号引用转变为直接引用,而且动态常量池里的内容是能动态添加的。例如调用String的intern方法就能将string的值添加到String常量池中,这里String常量池是包含在动态常量池里的,但在jdk1.8后,将String常量池放到了堆中。

    展开全文
  • 堆 栈 方法区存放的是什么 ?

    千次阅读 2019-05-22 15:20:36
    方法区 这个题我们要注意的是题干的问题, 是问 " 进程 " 中的哪个区, 而不是JVM中的哪个区. 答案是D 堆区 存储的是一切new出来的对象 栈区 存储基本数据类型的值和对象引用. 每个栈中的数据( 基础数据类型和对象...

    首先来看一道题 :
    单选题 : 方法通常存储在进程中的哪个区 ?
    A. 堆区
    B. 栈区
    C. 全局区
    D. 方法区

    这个题我们要注意的是题干的问题, 是问 " 进程 " 中的哪个区, 而不是JVM中的哪个区. 答案是D

    1. 堆区
      存储的是一切new出来的对象
    2. 栈区
      存储基本数据类型的值和对象引用.
      每个栈中的数据( 基础数据类型和对象引用 )都是私有的,其他栈不可以访问.
      栈分为三个部分 : 基本类型变量区 , 执行环境上下文 , 操作指令区(存放操作指令)
    3. 方法区
      保存所有的class文件和static变量与方法

    举例 :String str = new String(“hello”);

    • 堆 存储的是new出来的对象, jvm中只有一个堆区, 被所有的线程共享
    • 栈 是变量str, 每个栈中的数据私有的, 其他栈不可以访问
    • 方法区 是"hello" , 被所有的线程共享, 方法区包含所有的class static变量

    栈和堆的区别就像 :

    • 使用栈就像是去饭馆里吃饭, 只管点菜, 付钱和吃, 吃饱了就走, 不必理会切菜, 洗菜等准备工作和洗碗刷锅等, 他的好处是快捷, 但是自由度小
    • 使用堆就像是自己动手做饭, 比较麻烦, 但是比较符合自己的口味, 而且自由度大.
    展开全文
  • 堆、栈、方法区存放的是什么

    千次阅读 2018-06-26 22:43:01
    String str=new String("hello");堆 存放的是new出来的对象栈 是变量str方法区 是“hello”

    String str=new String("hello");

    堆 存放的是new出来的对象  jvm中只有一个堆区 被所有的线程共享

    栈 是变量str  每个栈中的数据私有的 其他栈不能访问。

    方法区 是“hello”;被所有的线程共享,方法区包含所有的class static变量。

    堆和栈的区别可以用如下的比喻来看出:

    • 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就 
      走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自 
      由度小。

    • 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由 
      度大。


    展开全文
  • 堆栈存放什么

    2020-08-13 10:22:01
    2.堆:存放不在当前方法栈中的那些数据 二、内存区域类型 1.寄存器:最快的存储, 由编译器根据需求进行分配,我们在程序中无法控制; 1. 栈:存放基本类型 的变量数据和对象的引用,但对象本身不存放在栈中,...
  • 前面的几篇都没有太明确地指出 方法区 是什么?...方法区存放的信息包括: 类的基本信息: 1.每个类的全限定名 2.每个类的直接超类的全限定名(可约束类型转换) 3.该类是类还是接口 4.该...
  • 从上述看来,方法区存放的东西与方法并没有什么联系,反而栈中存放的是与方法相关的一些信息,那么为什么还取名为方法区,意义何在? 季冬 github.com/jidong-cs 20 人赞同了该回答 题主说到栈中存放了局部...
  • 方法区存放的是类型信息、常量、静态变量、即时编译器编译后的代码缓存、域信息、方法信息等。随着JDK的发展,方法区存放的内容也在发生变化。并不绝对。通常情况下放的是这些内容。 1.类型信息 2.域
  • 什么方法区?JVM内存模型中堆与方法区的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、堆(Heap) 1.1.什么是堆 堆是用于存放对象的内存区域。因此,它是垃圾收集器(GC)管理的主要...
  • java方法区存储了什么

    千次阅读 2018-03-23 21:10:48
    另外,这里ps一下,Class对象是存放在堆区的,不是方法区!这点很多人容易犯错。类的元数据(元数据并不是类的Class对象!Class对象是加载的最终产品,类的方法代码,变量名,方法名,访问权限,返回值等等都是在...
  • 想必大家还不知道存储区是分为两种类型的,常量缓冲池和方法区。相信很多人还没有接触到这个概念,本篇对java中jvm的存储区进行的内容的整理,下面一起来看看这两种存储取的概念和区别吧。1、分类JVM有两种类型的...
  • 方法区

    2021-02-16 22:34:52
    VS 常量池常量池为什么需要常量池常量池中有什么小结运行时常量池方法区使用举例方法区的演进细节为什么永久代要被元空间替代?StringTable为什么要调整位置静态变量存放在那里?方法区的垃圾回收总结常见面试题 ...
  • java方法区究竟存储了什么

    万次阅读 多人点赞 2016-05-14 13:40:46
    另外,这里ps一下,Class对象是存放在堆区的,不是方法区!这点很多人容易犯错。类的元数据(元数据并不是类的Class对象!Class对象是加载的最终产品,类的方法代码,变量名,方法名,访问权限,返回值等等都是在...
  • a因为是基本数据类型的局部变量,所以a和1都放栈里第二段代码 test是引用类型的局部变量,所以栈存放test的引用地址指向堆,堆里存放test实例数据,age值初始化为0,height属于类变量存放方法区初始化为0第三段,...
  • 这里内存不是操作系统的内存,16G 32G。而是指jvm这一小块的内存。 栈:存放的是局部变量 堆:存放的是对象 方法区存放的是字节码信息
  • 方法区被所有的线程所共享,方法区包含所有的class和static变量。堆区:1、存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)2、jvm只有一个堆区(heap)被所有线程共享,堆中...
  • JVM为每一个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量等) 栈是线程私有,不能实现线程之间的共享! 栈的存储特性: 先进后出 栈是由系统自动分配,速度快!栈是一个连续的内存空间 堆 堆...
  • JVM方法区

    2020-09-12 14:31:12
    final的类变量全局常量运行时常量池 VS 常量池运行时常量池常量池方法区的垃圾回收设置方法区大小与OOMjdk7及以前JDK8以后如何解决这些OOM栈、堆、方法区的交互关系方法区使用举例方法区的演进细节为什么永久代要被...
  • 方法区概述

    2020-06-24 10:31:27
    方法区,是用来存放有关 类、方法 信息的一块逻辑上的区域。也就说,人们想规划出一块区域,用来存储类 方法 相关信息。 除此之外,还用来存储常量、静态变量,以及一些代码缓存等数据。 想想,这些数据都有什么特点...
  • JDK6及之前,方法区的实现是永久代,静态变量和字符串常量池存放在永久代中,其中,字符串常量池存放在运行时常量池。 3.JDK7的方法区 JDK7,方法区的实现还是永久代。但是静态变量以及字符串常量池已经被移到了堆...
  • 最近一直被方法区里面存着什么东西困扰着?1.方法区里存class文件信息和class文件常量池是个什么关系。2.class文件常量池和运行时常量池是什么关系。方法区存着类的信息,常量和静态变量,即类被编译后的数据。这个...
  • 7_方法区

    2021-01-29 14:12:48
    Person:存放在元空间,也可以说方法区 person:存放在Java栈的局部变量表中 new Person():存放在Java堆中 是什么 《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现...
  • 方法区(上)

    2020-09-20 11:41:14
    方法区(上)栈、堆、方法区的交互关系方法区的理解元空间和永久代的区别设置方法区大小与OOM设置方法区大小如何解决OOM方法区的内部结构存储的东西常量池和运行时常量池为什么需要常量池?运行时常量池 栈、堆、...
  • 方法区和常量池

    万次阅读 多人点赞 2017-11-15 21:20:11
    最近一直被方法区里面存着什么东西困扰着?  1.方法区里存class文件信息和class文件常量池是个什么关系。  2.class文件常量池和运行时常量池是什么关系。    方法区存着类的信息,常量和静态变量,即类被编译后...
  • 文章目录堆、栈、方法区的交互关系方法区的理解HotSpot虚拟机中方法区的演进设置方法区大小的参数解决报错OOM:(内存泄漏、内存溢出)方法区的内部结构方法区的演进细节一些细节StringTable 为什么要调整?...
  • 方法区在Hotspot虚拟机中也成为永久代,这一部分用于存放Class和Meta的信息,Class被加载的时候,会将类信息等放入方法区,它和存放实例的堆区域不同,GC不会再主程序运行期间堆永久带进行清理,所以如果加载很多的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 690
精华内容 276
关键字:

方法区存放什么