下面的内容全部来自网络,基本无原创。只是学习笔记而已。
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
分享到:
相关推荐
主要是JVM内存分配及简单的JVM性能调优
关于java的内存分配问题,jvm的运行原理相关资料总结
JVM初始分配的内存.doc JVM初始分配的内存.doc
个人整理 jvm相关知识 包括内存分配机制 垃圾回收机制 垃圾收集器相关 及 垃圾收集算法
NULL 博文链接:https://younglibin.iteye.com/blog/1959816
1.jvm内存结构及功能概述 2.Jvm Heap 内存结构 3.Jvm 的内存分配
23丨如何优化JVM内存分配?.html
1.1 对象优先在Eden区分配 1.2 大对象直接进入老年代 1.3 长期存活的对象将进入老年代
Jvm对象内存分配理解
详细介绍了JVM 内存管理相关知识 内存空间( VM运行时数据区域) ◦ 内存结构 ◦ 内存空间 内存分配 内存回收(GC) 内存分析工具
JVM初探- 内存分配、GC原理与垃圾收集器,从从提上讲解了jvm中GC的原理、基本的算法和针对不同内存区使用的算法,同时,详细的讲解了当前主要使用的垃圾收集器
JVM内存段分配,Java垃圾回收调优,Heap设定
1、JVM 内存分配图解的 Visio 工程图。 2、直接下载使用、可自行调整和修改
NULL 博文链接:https://bxf12315.iteye.com/blog/1575773
JVM垃圾回收器和内存分配策略
jmap -heap pid可以查看应用程序堆的信息jstat可以打印元空间信息MC :分配到元空间大小MU:已使用的元空间大小 元空间是可以自己扩容的元空间:
JVM初探内存分配GC原理与垃圾收集器共16页.pdf.zip