Java内存结构

来源:互联网 发布:淘宝牛仔裤女 编辑:程序博客网 时间:2024/06/02 16:04

1.整体结构

                    

2.方法区

         (1)作用

                   是JVM在装载类class文件时,用于存储类型信息(即类的描述信息)的区域

         (2)存储信息

                   1>类的基本信息

                       1)类的全限定名(qualified name)

                       2)类的父类的全限定名

                       3)该类是类还是接口

                       4)该类的访问修饰符

                   2>已装载类的详细信息

                      1)常量池

                            其中保存了一些常量,包括字符串常量,final变量值,类名,方法名等

                      2)字段信息

                            存放类中声明的每一个字段的信息,包括字段的名称、类型、访问修饰符

                      3)方法信息

                            存放类中声明的每一个方法的信息,包括方法名、返回值类型、参数类型、修饰符、异常、方法的字节码(在编译的时候,就已经将方法的局部变量、操作数栈大小等确定并存放在字节码中,在装载的时候,随着类一起装入方法区)

                      4)静态变量

                            方法区中有一个静态区,专门存放静态变量和静态代码块,供所有对象使用

                      5)到类Class的引用

                            虚拟机为每一个被装载的类型创建一个class实例,用来代表被装载的类


3.虚拟机栈

                   存放方法的调用,包括调用参数、局部变量、中间结果等。每调用一个方法,就将该方法压入java栈,当调用结束时,就弹出该方法。

                   也就是说,在方法中定义基本类型的变量和引用变量都会在方法的栈内存中分配。当在一段代码块中定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后(也就是方法执行完后),Java会自动释放掉为该变量所分配的内存空间,该内存空间可以被其他地方使用。


4.堆

                   是一个运行时的数据区,用来存储数据,存放通过new (newInstance等)来创建的对象或者数组。


5.本地方法栈

                   为native方法服务,功能与虚拟机栈相同


6.程序计数器

                   用来记录当前线程执行的下一条指令的位置,相当于PC寄存器


7.程序执行实例

                   

                 (1)JVM首先自动寻找main方法,执行第一句代码,在堆中创建一个Test类的对象,并在栈中分配一块内存,存放一个指向堆中对象的指针110925

                 (2)创建一个int类型的变量date,由于是基本类型,那么就直接在栈中存放达特对应的值9

                 (3)在堆中创建BirthDate类的对象d1、d2,在栈中分别存放了对应的指针指向各自的对象


                  

                  调用test的change1方法,会将date的值为参数,JVM读到这段代码时,检测到i是局部变量,因此会将i放在i中,并把date的值赋给i

              

                将1234赋给i

            

             change1执行结束,立即释放局部变量i所占的栈空间

        

          调用test对象的change2方法,以d1作为参数。JVM检测到change2方法中的参数b为局部变量,立即加入到栈中,由于是引用类型的变量,所以b中保存的是d1的指针,此时b、d1指向同一个堆中的对象

        

               change2方法中又实例化了一个BirthDate对象,并且赋值给b。执行过程为:在堆中new了一个对象,并且把该对象的指针保存在栈中b对应的空间,此时b不再指向d1所指向的独享,但是实际上d1所指向的对象并无变化,这样对d1没有造成任何影响

              

             到此change2方法执行完毕,立即释放局部变量b所占的栈空间,注意只是释放了栈空间,堆空间需要等待自动回收

               

              调用test的change3方法,以d2为参数。同理,JVM会在栈中为局部引用变量b分配空间,并且把d2中的指针保存在b中。

              

              调用b的setDay会影响d2,因为二者指向的是同一个对象


0 0
原创粉丝点击