您的位置:首页 > 编程语言 > Java开发

JVM内存结构

2018-02-06 21:27 621 查看
JVM是根据运行时数据的存储结构来划分内存结构的,运行时数据包括java程序本身的数据信息和jvm运行java程序需要的额外数据信息。JVM运行时数据区:程序计数器:每条线程有一个独立的程序计数器,用于保存当前正常执行的程序的内存地址。动态内存分配。所有线程共享,在虚拟机启动时创建,可以处于物理上不连续的存储空间。此区域的唯一目的就是存放对象实例方法区线程共享。当JVM使用类装载器装载某个类时,首先获取class文件,提取该文件的内容信息,将这些信息存储到方法区,最后返回一个class实例。方法区用于存储已经被虚拟机加载的类信息(class),常量,静态变量(static),即时编译期编译后的代码数据等。称为“永久代”。GC在这区域较少出现,内存回收的主要目标是针对常量池的回收和对类的卸载(某个类不再使用)。运行时常量池是方法区的一部分,class文件中除了有类的版本,字段,方法,接口等描述信息以外,还有一项信息是常量池。常量池:用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。运行时常量池对于class文件常量池具备动态性,在程序运行期间也可以将新的常量放入池中。静态内存分配。线程私有,它的生命周期与线程相同。每当创建一个线程时,JVM为这个线程创建一个对应的栈;每运行一个方法就在栈中创建一个栈帧,每个栈帧会含有局部变量表,操作数栈,动态链接,方法出口等信息。(局部变量表,存放了编译期可知的各种基本数据类型,对象引用类型。局部变量表所需的内存空间在编译期间完成分配,方法运行期间不会改变局部变量表的大小)每一个方法从调用直至执行完成的过程,就对应着一个栈帧在栈中入栈到出栈的过程。本地方法栈与栈作用类似,本地方法栈为虚拟机运行native方法服务(很多native方法由c语言实现)

内存分配的策略1. 静态存储分配要求在编译时知道所有变量的存储要求,不允许有可变数据结构(如可变数组),也不允许有嵌套或递归结构出现2. 栈式(动态)存储分配要求在程序模块入口处必须知道所有的存储要求3. 堆式存储分配专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,如可变长度串和对象实例.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 内存结构