java虚拟机中类与对象的内存布局研究(源码)
摘要:Java虚拟机的运行时数据区主要由方法区、堆区和虚拟机栈组成,其中方法区和堆区为线程共享区域,虚拟机栈为单个线程所有。本文针对Java虚拟机规范,主要介绍了Java运行时的内存区域,包括方法区、堆区和虚拟机栈的创建和管理的基本实现方法,并通过虚拟机栈的管理实现线程的基本管理。方法区和堆区采用“段页式”两级管理机制,即:按程序的自然结构分段,段内分为等长的页,管理、共享或保护按段进行,进出按页进行。虚拟机栈根据线程创建,栈元素为栈帧,栈帧的入栈和出栈依据方法的调用和结束,每个栈帧包含局部变量表和操作数栈,线程中包含程序计数器、线程状态等信息。
目录
摘要1
关键词1
Abstract1
Key words1
引言1
1概述2
1.1 国内外研究状况2
1.2 开发环境与工具2
1.3 研究内容2
1.4 技术路线2
1.5实现功能3
2 Java虚拟机3
2.1 Java虚拟机简介3
2.2 Java虚拟机运行时数据4
3 Java堆4
3.1 Java堆与垃圾收集4
3.1.1 Java堆与实现方式4
3.1.2垃圾收集5
3.2 程序的实现方法5
3.2.1 数据结构5
3.2.2 实现功能6
3.2.3 主要算法6
3.3 流程图7
4 方法区7
4.1 方法区7
4.2 程序的实现方法7
5 Java虚拟机栈8
5.1 Java虚拟机栈8
5.2 Java内存模型与线程8
5.2.1 Java线程8
5.2.2 线程调度8
5.3 程序的实现方法9
5.3.1 数据结构9
5.3.2 实现功能10
5.3.3 主要算法13
5.4 流程图15
6 测试和运行结果16
6.1 创建主线程16
6.2 分配Ja
*好棒文|www.hbsrm.com +Q: 3_5_1_9_1_6_0_7_2
va堆内存空间17
6.3 创建新线程18
6.4 虚拟机栈测试18
6.5 线程调度20
6.6 垃圾收集20
7 总结与讨论21
7.1 讨论21
7.2 总结21
致谢22
参考文献23
Java虚拟机中类与对象的内存布局研究
引言
引言:1991年4月,由James Gosling博士领导的绿色计划开始启动,此计划的目的是开发一种能够在各种消费性电子产品上运行的程序架构,这个计划的产品就是Java语言的前身:Oak(橡树)。1995年正式更名为Java,并正式提出了“Write Once,Run Anywhere”的口号。第一个Java运行环境JDK 1.0的发布主要包括三个部分:虚拟机、Applet、AWT。Java语言之所以能够如此流行除了因为它摆脱了硬件条件的束缚外,还因为它提供了一个相对安全的内存管理和访问机制、多线程、分布式、丰富的第三方开源组件。
Java之所以能够实现“一次编程,到处可运行”,主要归结于Java体系结构中的虚拟机机制。与C和C++语言不同,Java源代码默认的编译结构并非是可执行代码,而是具有平台通用性的字节码,再由基于不同平台的虚拟机解释执行该字节码[1]。类经过加载、验证、准备、解析、初始化,虚拟机从其中提取出相关信息,构造成运行时数据结构。Java虚拟机自动管理内存进行内存分配和垃圾收集,程序员没有内存控制的权利,因此,一旦出现内存泄露和溢出方面的问题,不了解虚拟机是如何分配内存的将十分麻烦。所以,如何构造和实现Java虚拟机的内存管理是本次研究的重点。
概述
1.1 国内外研究状况
从Sun公司发布的JDK1.0开始,距今JDK1.9即将问世。国外许多公司如:IBM,Oracle,BEA等都研发出了自己的虚拟机产品,如众所周知的HotSpot虚拟机, 采用自适应优化的方式,分代式垃圾收集算法。Sablevm1.0.9是大学计算机系的一个研究性质的开放源代码的虚拟机实现,采用的垃圾收集算法是精确的拷贝算法,解释执行字节码[1]。
目前,国内虚拟机的研究成果相比国外还有很大的差距,研究机构和大学对虚拟机这一领域的研究并不是很多,主要研究的是Java虚拟机在嵌入式方面的应用,只有清华大学等少数大学涉及这一领域,但是目前还没有自主研发的产品。国内在虚拟机这一方面主要研究的问题是:Java虚拟机的线程模型, Java虚拟机执行引擎,编译优化,自适应优化技术,Java虚拟机的内存管理策略等。近年来,国内也已经开展了对垃圾收集技术的研究[1]。国内第一家成功推出嵌入式虚拟机平台的是北京科银京成技术有限公司,其产品为Deltakvm[2]。
1.2 开发环境和工具
开发环境为VC++6.0,开发语言为C++/C语言。之所以选择C++/C,是因为内存管理中需要指针传递,而Java没有指针,所以Java虚拟机本身的开发语言也是C++/C。
1.3 研究内容
本文主要研究:
(1)方法区内存管理;
(2)堆区内存管理:包括对象实例在堆的内存分配、垃圾收集;
(3)虚拟机栈的创建和使用:包括线程管理;
1.4 技术路线
具体技术路线如图所示:
图11 技术路线图
1.5 实现功能
本次设计分为两个模块:功能模块和测试模块。
功能模块:
管理堆区内存,维护段表、页表;
管理方法区内存,维护段表、页表;
管理线程的工作内存,维护线程表;
(4) 利用线程的虚拟机栈,完成基本的循环、赋值操作;
测试模块:
读入堆区测试数据,根据测试数据,为类的实例对象在堆区分配内存;
测试数据:类的个数,每个类的对象数,每个类的对象需要分配的页数
读入方法区测试数据,根据测试数据,为类的成员变量和方法变量在方法区分配内存;
测试数据:类的个数,每个类需要在方法区分配的页数
读入线程测试数据,开始线程调度,线程进入新建队列时,分配线程私有虚拟机栈。继续线程调度,线程进入运行状态时,读入虚拟机栈测试数据,根据字节码指令,完成相应操作,最后线程进入死亡队列,回收资源,清理内存;
目录
摘要1
关键词1
Abstract1
Key words1
引言1
1概述2
1.1 国内外研究状况2
1.2 开发环境与工具2
1.3 研究内容2
1.4 技术路线2
1.5实现功能3
2 Java虚拟机3
2.1 Java虚拟机简介3
2.2 Java虚拟机运行时数据4
3 Java堆4
3.1 Java堆与垃圾收集4
3.1.1 Java堆与实现方式4
3.1.2垃圾收集5
3.2 程序的实现方法5
3.2.1 数据结构5
3.2.2 实现功能6
3.2.3 主要算法6
3.3 流程图7
4 方法区7
4.1 方法区7
4.2 程序的实现方法7
5 Java虚拟机栈8
5.1 Java虚拟机栈8
5.2 Java内存模型与线程8
5.2.1 Java线程8
5.2.2 线程调度8
5.3 程序的实现方法9
5.3.1 数据结构9
5.3.2 实现功能10
5.3.3 主要算法13
5.4 流程图15
6 测试和运行结果16
6.1 创建主线程16
6.2 分配Ja
*好棒文|www.hbsrm.com +Q: 3_5_1_9_1_6_0_7_2
va堆内存空间17
6.3 创建新线程18
6.4 虚拟机栈测试18
6.5 线程调度20
6.6 垃圾收集20
7 总结与讨论21
7.1 讨论21
7.2 总结21
致谢22
参考文献23
Java虚拟机中类与对象的内存布局研究
引言
引言:1991年4月,由James Gosling博士领导的绿色计划开始启动,此计划的目的是开发一种能够在各种消费性电子产品上运行的程序架构,这个计划的产品就是Java语言的前身:Oak(橡树)。1995年正式更名为Java,并正式提出了“Write Once,Run Anywhere”的口号。第一个Java运行环境JDK 1.0的发布主要包括三个部分:虚拟机、Applet、AWT。Java语言之所以能够如此流行除了因为它摆脱了硬件条件的束缚外,还因为它提供了一个相对安全的内存管理和访问机制、多线程、分布式、丰富的第三方开源组件。
Java之所以能够实现“一次编程,到处可运行”,主要归结于Java体系结构中的虚拟机机制。与C和C++语言不同,Java源代码默认的编译结构并非是可执行代码,而是具有平台通用性的字节码,再由基于不同平台的虚拟机解释执行该字节码[1]。类经过加载、验证、准备、解析、初始化,虚拟机从其中提取出相关信息,构造成运行时数据结构。Java虚拟机自动管理内存进行内存分配和垃圾收集,程序员没有内存控制的权利,因此,一旦出现内存泄露和溢出方面的问题,不了解虚拟机是如何分配内存的将十分麻烦。所以,如何构造和实现Java虚拟机的内存管理是本次研究的重点。
概述
1.1 国内外研究状况
从Sun公司发布的JDK1.0开始,距今JDK1.9即将问世。国外许多公司如:IBM,Oracle,BEA等都研发出了自己的虚拟机产品,如众所周知的HotSpot虚拟机, 采用自适应优化的方式,分代式垃圾收集算法。Sablevm1.0.9是大学计算机系的一个研究性质的开放源代码的虚拟机实现,采用的垃圾收集算法是精确的拷贝算法,解释执行字节码[1]。
目前,国内虚拟机的研究成果相比国外还有很大的差距,研究机构和大学对虚拟机这一领域的研究并不是很多,主要研究的是Java虚拟机在嵌入式方面的应用,只有清华大学等少数大学涉及这一领域,但是目前还没有自主研发的产品。国内在虚拟机这一方面主要研究的问题是:Java虚拟机的线程模型, Java虚拟机执行引擎,编译优化,自适应优化技术,Java虚拟机的内存管理策略等。近年来,国内也已经开展了对垃圾收集技术的研究[1]。国内第一家成功推出嵌入式虚拟机平台的是北京科银京成技术有限公司,其产品为Deltakvm[2]。
1.2 开发环境和工具
开发环境为VC++6.0,开发语言为C++/C语言。之所以选择C++/C,是因为内存管理中需要指针传递,而Java没有指针,所以Java虚拟机本身的开发语言也是C++/C。
1.3 研究内容
本文主要研究:
(1)方法区内存管理;
(2)堆区内存管理:包括对象实例在堆的内存分配、垃圾收集;
(3)虚拟机栈的创建和使用:包括线程管理;
1.4 技术路线
具体技术路线如图所示:
图11 技术路线图
1.5 实现功能
本次设计分为两个模块:功能模块和测试模块。
功能模块:
管理堆区内存,维护段表、页表;
管理方法区内存,维护段表、页表;
管理线程的工作内存,维护线程表;
(4) 利用线程的虚拟机栈,完成基本的循环、赋值操作;
测试模块:
读入堆区测试数据,根据测试数据,为类的实例对象在堆区分配内存;
测试数据:类的个数,每个类的对象数,每个类的对象需要分配的页数
读入方法区测试数据,根据测试数据,为类的成员变量和方法变量在方法区分配内存;
测试数据:类的个数,每个类需要在方法区分配的页数
读入线程测试数据,开始线程调度,线程进入新建队列时,分配线程私有虚拟机栈。继续线程调度,线程进入运行状态时,读入虚拟机栈测试数据,根据字节码指令,完成相应操作,最后线程进入死亡队列,回收资源,清理内存;
版权保护: 本文由 hbsrm.com编辑,转载请保留链接: www.hbsrm.com/jsj/jsjkxyjs/2229.html