`
bxf12315
  • 浏览: 26368 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jvm内存分配(3)

    博客分类:
  • java
 
阅读更多

下面的内容全部来自网络,基本无原创。只是学习笔记而已。

3 Run time data area 结构

Runtime data area 主要包括五个部分:Heap (), Method Area(方法区域), Java Stack(java的栈), Program Counter(程序计数器), Native method stack(本地方法栈)Heap Method Area是被所有线程的共享使用的;而Java stack, Program counter Native method stack是以线程为粒度的

 

 



 
寄存器= Program Counter(程序计数器)JVM内部虚拟寄存器,存取速度非常快,程序不可控制。,

 

          栈:保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。

        堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

        常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中

        Method area

代码段:用来存放从硬盘上读取的源程序代码。

 

                   数据段:用来存放static定义的静态成员。

 


 

3.1 寄存器

JVM有自己的虚拟寄存器,这样就可以快速地与JVM的解释器进行数据交换。为了功能的需要,JVM设置了4个常用的32位寄存器:pc(程序计数器)、optop(操作数栈顶指针)、frame(当前执行环境指针)和vars(指向当前执行环境中第一个局部变量的指针)

3.2 Method area

在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中。类型信息是由类加载器在类加载时从类文件中提取出来的。(静态)变量也存储在方法区中

A 当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。

B Jvm实现的设计者决定了类型信息的内部表现形式。如,多字节变量在类文件是以big-endian存储的,但在加载到方法区后,其存放形式由jvm根据不同的平台来具体定义。

C jvm在运行应用时要大量使用存储在方法区中的类型信息。在类型信息的表示上,设计者除了要尽可能提高应用的运行效率外,还要考虑空间问题。根据不同的需求,jvm的实现者可以在时间和空间上追求一种平衡。

D因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如两个线程都在试图找lava的类,在lava类还没有被加载的情况下,只应该有一个线程去加载,而另一个线程等待。

E方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。同样方法区也不必是连续的。方法区可以在堆(甚至是虚拟机自己的堆)分配。jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。

-XX:PermSize=20M. 设置方法区的初始大小. -XX:MaxPermSize=30M. 设置方法区的最大值

F方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态扩展java程序,一些类也会成为垃圾。jvm可以回收一个未被引用类所占的空间,以使方法区的空间最小。

         Method area区也是heap结构的,在java 堆结构中属于永生区

3.2.1 类型信息

对每个加载的类型,jvm必须在方法区中存储以下类型信息:

1 类的全限定名

2 类的超类的全限定名

3 这个类是类型还是接口

4 类的访问修饰符

5域信息(又可称为应该也包含5

jvm必须在方法区中保存类型的所有域的相关信息以及域的声明顺序,

域的相关信息包括:

域名

域类型

域修饰符(public, private, protected,static,final

        volatile, transient的某个子集)

6 超接口的权限定名的有序类表

7 该类的常量池    

该类型所使用常量的一个有序集合,包括直接类型和对其他类的,字段和方法的符号引用。

8 字段信息  

字段名,字段类型,字段的修饰符(eg:private String field)

9 方法信息  

方法名,方法的返回信息,方法的修饰符(eg:public  void method,如果一个方法不是抽象的和本地的还将保存一下信息:方法的字节码,操作数栈和方法的栈帧中的局部变量的大小,异常表

10 除了常量以外的所有类变量

类变量是多有类实例共享的,但是没有类实例也可以访问,只与类有关,编译时常量11 一个到classLoader的引用

12 一个到class类的引用

13 方法表(为了尽可能的提高访问效率,大部分虚拟机对每个装载的费抽象类,都生成一个方法表,把他们当做类型信息放在方法去类。)  方法区同样可以被垃圾回收。

  • 大小: 58.5 KB
  • 大小: 73.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics