栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA内存模型JVM

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA内存模型JVM

1.堆(Heep):运行时的数据区,在运行时动态分配内存大小,垃圾收集器会自动收集不再使用的数据,由于要在运行时动态分配数据,存取速度较慢。

2.栈(Stack):栈数据是共享的,大小和生存期必须是确定的,缺乏灵活性。栈数据是共享的,存取速度较快,仅次于cpu寄存器。

详情:java内存模型要求调用栈和本地变量存放在线程栈(Thread Stack)中,对象存放在堆中。

本地变量可能是一个对象的引用,引用本地变量在线程栈中,对象在堆中,一个对象可能包含方法,这些方法可能包含本地变量,但也存放在线程栈中,即使这些方法所属对象存放在堆中。如果两个线程同时调用了同一个对象,那么两个线程都会拥有这个对象的私有拷贝。 

jvm内存模型详细图:

 局部变量:

(1)当声明的是基本类型的变量的时,其变量名和值是在栈中。

(2)当声明的是引用类型变量时,所声明的变量名(在方法中存储的是内存地址值)是在栈中,该变量所指向的对象是放在堆类存中。

成员变量:

(1)当声明的是基本类型的变量其变量名及其值放在堆中。

(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象,    变量名和对象存储在相应的堆中。

3.方法区(jdk移动到堆中去了)详情:

    1.类信息:  修饰符(public final),

                        类或接口(class,interface)

                        类的全限定名(Test/ClassStruct.class)

                        直接父类的全限定名(java/lang/Object.class)

                        直接父接口的权限定名数组(java/io/Serializable)

        也就是 public final class ClassStruct extends Object implements Serializable这段描述的信息提取

       2.字段信息:修饰符(pirvate)

                            字段类型(java/lang/String.class)

                            字段名(name)

          也就是类似private String name;这段描述信息的提取

       3.方法信息:修饰符(public static final)

                          方法返回值(java/lang/String.class)

                          方法名(methodName)

                          参数需要用到的局部变量的大小还有操作数栈大小

                          方法体的字节码(就是花括号里的内容)

                          异常表(throws Exception)

         也就是对方法public static final String getStatic_str ()throws Exception的字节码的提取
       4.常量池:

                    4.1.基本数据类型基础直接常量:

                                   1.1CONSTANT_INGETER_INFO整型直接常量池public final int                                                          CONST_INT=0;

                                   1.2CONSTANT_String_info字符串直接常量池   public final String                                                        CONST_STR="CONST_STR";

                                   1.3CONSTANT_DOUBLE_INFO浮点型直接常量池 

                        只有被final修饰的基本数据类型和String类型变量在编译时才会被确定下来,因此                         存放在常量池中。

                     4.2.方法名、方法描述符、类名、字段名,字段描述符的符号引用。

       也就是所有编译器能够被确定,能够被快速查找的内容都存放在这里,它像数组一样通过索引访问,就是专门用来做查找的。

       编译时就能确定数值的常量类型都会复制它的所有常量到自己的常量池中,或者嵌入到它的字节码流中。作为常量池或者字节码流的一部分,编译时常量保存在方法区中,就和一般的类变量一样。但是当一般的类变量作为他们的类型的一部分数据而保存的时候,编译时常量作为使用它们的类型的一部分而保存

      5.类变量(静态变量):

                  就是静态字段( public static String static_str="static_str";)

                  虚拟机在使用某个类之前,必须在方法区为这些类变量分配空间。

      6.一个到classLoader的引用,通过this.getClass().getClassLoader()来取得为什么要先经过class呢?思考一下,看一下上面的图,再回来思考。(class A 对象拥有A字节码和加载它的加载器地址引用)

      7.一个到class对象的引用,这个对象存储了所有这个字节码内存块的相关信息。所有你能够看到的区域,比如:类信息,你可以通过this.getClass().getName()取得

          所有的方法信息,可以通过this.getClass().getDeclaredMethods(),字段信息可以通过this.getClass().getDeclaredFields(),等等,所有在字节码中你想得到的,调用的,通过class这个引用基本都能够帮你完成。因为他就是字节码在内存块在堆中的一个对象

      8.方法表:它的内容就是这个类的所有实例可能被调用的所有实例方法的直接引用。也是为了动态绑定的快速定位而做的一个类似缓存的查找表,它以数组的形式存在于内存中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/288305.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号