您好, 访客   登录/注册

Java内存模型描述及变量运用分析

来源:用户上传      作者:

  摘 要:在使用Java编程的过程中,内存是保障编程程序顺利进行的重要资源,而加强对内存的合理、有效运用,有助于编程效率的极大提升,并且在大量的研究和探索中,挖掘出其更加全面的功能。本文主要对Java内存模型的概念、Java的内存分配及相关功能进行了介绍,最后通过对Java内存的详细分析,明确了Java内存分配机制的具体应用,以供相关研究工作者参考。
  关键词:Java内存模型;Java堆;内存分配;Java虚拟机栈
  中图分类号:TP311.11 文献标识码:A 文章编号:2096-4706(2019)04-0098-02
  Java Memory Model Description and Variable Utilization Analysis
  WANG Maogang
  (Guangdong Industry and Trade College,Foshan 528237,China)
  Abstract:In the process of using Java programming,memory is an important resource to ensure the smooth progress of programming program,and strengthening the rational and effective use of memory will help greatly improve the efficiency of programming,and in a large number of research and exploration,excavate its more comprehensive functions. In this paper,the concept of Java memory model,Java memory allocation and related functions are introduced. Finally,through the detailed analysis of Java memory,the specific application of Java memory allocation mechanism is clarified for the reference of relevant researchers.
  Keywords:Java memory model;Java heap;memory allocation;Java virtual machine stack
  0 引 言
  运用具有特定体系结构的计算机来开发和设计各种编程程序时,需加强对计算机内存的管理和合理运用。在保存和运行各种程序时,需要依靠内存的作用來实现,此外,在保存执行结果时,也需发挥内存的作用。Java语言是面向对象、服务于对象的,在它的内部结构中,具备完善的自动管理能力和设计内存模型的作用。开发者在编制相应的代码,创建一定的应用程序时,既需要确保算法的科学和合理,又要对Java的内存模型及相关的管理策略进行深入理解,从而在编程的过程中,充分发挥它们的作用来促进编程工作的顺利进行。本文主要分析了Java内存模型的含义、Java内部组成情况及编程过程中的应用机制等,希望可为Java编程教学工作提供有利参考。
  1 Java内存模型概述
  1.1 Java内存模型的概念
  相比于以往Java对计算机语言的生成,Java平台的应用有助于集成多处理器及线程技术,该语言主要被具有独立性的多种异构平台所使用。由此可知,Java语言主要运用在不同的平台之间,具有跨平台的性质,它的这种性质主要表现为当对*.java源程序进行编译,使其变为*.class的字节码后,该字节码文件具有跨平台性质。然而,在对该字节码文件进行执行时,还需利用Java虚拟机即JVM(Java Virtual Machine)来加载、解释、校验、运行等字节码文件,从而来更好的执行该文件,Java虚拟机与各项操作系统都有很大关联。通过Java程序在执行时的具体流程可知,在内存中,加载完字节码文件后,需依靠JVM对内存的管理作用,来有效的执行该程序。Java内存模型对于程序中的数组元素、实例域等变量之间的关系进行了描述,并且在进行编程时,利用计算机系统,完成在内存中储存相关变量、然后再次取出变量等工作,对象始终被存储在内存里面,然而,利用处理器、运行库或者编译器,可以随意将位于内存中的变量进行存储或者取出。
  1.2 Java主要内部结构及作用
  在对Java虚拟机(JVM)的内部结构进行划分时,可将其分为几个不同的区域,而且每个区域都具有特定的功能,它们对各自的数据类型进行存储,大多数内存区会在JVM和线程的创建和消亡状态下发生相应改变。根据内存区域的不同,它们的生命周期和存储类型也有所差别,但是它们却可以对程序在运用时所具有的数据进行存储。在处于运行状态时,JVM可将数据区域进行划分,而且有一些内存区域和子系统被包含在JVM的内部结构中,JVM的子系统为类加载器,执行引擎位于内存区域中。
  1.2.1 程序计数器
  程序计数器作为一个内存区域,具有较小的空间和较快的速度,该区域处于CPU的内部位置,具有有限的数量。它作为指示指令地址的功能区域,可以用来指示字节码的行号。在对该区域进行控制时,无法由Java的内部应用程序来直接完成,需要字节码解释器在对程序计数器的数值进行改变的情况下,对将执行的字节码指令进行选择,因此,程序计数器与线程具有相同的生命周期。
  1.2.2 Java虚拟机栈
  Java虚拟机栈一般存在于通用RAM中,程序指令在进行操作时,需要由出入栈配合来完成。有较多的线程被保存在Java栈中,而且其方法又在栈帧中被存储。在本地方法栈中,保存着有关本地方法的调用状态,并且与Java栈处于相互分离的状态。对于线程中的方法,需要在多个组合栈帧的作用下来进行调用,伴随着方法的调用和完成,JVM对于新栈帧的处理状态也不同,可以完成对栈帧的入栈和出栈。因此,在分配Java栈的存储空间时,可以使内存空间在移动栈指针的作用下,来进行动态调整,这对于程序的运行具有较大的限制作用,促使其灵活性大大降低。但这种方法只对Java的基本数据类型适用,可用来存储Java对象的引用信息。   1.2.3 Java堆
  Java堆一般也在RAM中储存,它作为一种内存池,具有通用性质,可将Java引用类型的实例如数组、类类型、接口等进行存放。在创建对象时,主要由数组实例、类实例及派生实例来完成。Java堆的创建一般在启动虚拟机时进行,并且对于所有的线程具有共享作用。在运行时,Java堆可以对内存进行动态分配,对于那些没有引用价值的对象实例,可由Java的垃圾收集器(Garbage Collection)来进行自动回收。编译器可以在不知晓堆的生命周期、存储区域、对象存活时间等问题的情况下运行。因此,相对于栈的分配方式,堆具有相对灵活的分配策略,然而却具有较慢的存取速度。在栈中存储的数据具有共享性,但是由于栈具有独特的结构类型,因此,栈的分配不够灵活,必须确定栈中的生存期及数据数值。因此,与栈相比,在对存储空间进行分配时,堆需要花费较多的时间。
  1.2.4 方法区
  JVM中的所有线程都可以对方法区进行共享,它的存储对象为Java类的元数据类型。例如:类的常量池、方法信息、类型信息及域信息等,其中类型信息又包含类型的修饰符、名称、接口类表及父类的全名称等。
  2 Java程序内存分配
  在JVM自动管理机制的作用下,开发者的编程效率可以被极大地提升,然而,在过度依赖自动管理机制的情况下,就会使开发者丧失对问题的定位和解决能力。因此,需要充分掌握JVM的自动管理机制、内存模型及内存分配方法。
  Java在对内存进行分配时,可以选择在栈上、堆上或者静态存储区域来完成。在使用栈上分配时,可以对Java的引用类型变量及基本数据类型变量进行分配,堆上则可将对象实例分配给引用类型。在程序中创建对象实例时,可由new来完成,然后在堆内存中为该对象分配一定的存储空间,从而用以存储对象中的多个不同的成员变量。当这些对象实例不需再被运用的情况下,就可在垃圾收集器的作用下,对其进行回收处理。当JVM在运行程序时,字节码就会在类加载器的作用下被加载。方法区主要用于存储类文件中的一些信息和字节码等,Java堆和Java虚拟机栈则对一些重要信息进行存储。
  Java虚拟机栈作为线程的特有内存区域,只由一些特定的线程进行访问。Java虚拟机栈与线程具有一致的生命周期,可以对栈帧进行存储。Java堆作为线程的一种共享区域,它的存储对象为对象实例,此外,它也可以作为垃圾收集器在对垃圾进行回收处理的重要区域。
  3 Java编程时的内存分析及具體应用
  3.1 创建Java对象
  在Java中创建对象时,可以通过以下几种方式来完成:(1)其一是一种最常见的对象创建方法,即使用new语句来创建对象;(2)通过反射方式,调用实例的方法来完成;(3)对对象的clone()进行调用的方式;(4)采用反序列化手段调用对象的方式来完成。
  3.2 对象内存结构及初始化程序
  在Java内存模型中,需在完成相应的初始化操作之后,再对类的成员变量加以使用,在依靠自动化设计对每一个基本数据类型进行初始化操作时,它们都可以拥有一个相应的初始数值,例如:引用类型中的各个元素,它的初始数值为NULL。在对成员变量采取初始化操作时,可以依据第二种初始化方式即是指在类的构造方法里对成员变量进行初始化,在对成员变量进行初值确定时,可在定义类成员变量的区域来完成。第三种对变量进行初始化的方式,是指在初始化块中对已经声明的成员变量进行初始化,它是指是在对某一种方法进行调用的情况下,来初始化其中各个成员的变量。在类的内部,初始化的顺序与对变量的定义顺序密切相关。即使在方法定义的过程中,存在有一些变量定义,在对这些变量定义进行初始化时,也可以在调用任何方法之前来进行。
  4 结 论
  为了更好的掌握Java的编程功能,了解Java的具体应用方法,需加强对Java内存模型结构的理解,并且熟悉Java功能的分配情况。在编程程序运行的过程中,JVM的核心区域即是数据区,此外,编程过程也同样涉及到了方法区、Java堆及JVM栈,而且它们分别具有相应的存储内容,即方法区存储的内容为对象类型数据,Java堆对对象实例进行存储,而JVM栈则主要存储引用变量及基本数据类型的变量等。在创建对象、处理对象的基础上,进一步展示了内存模型的相关功能,促使人们了解了Java内存模型中各个功能的分配情况,并且对成员变量的初始化问题有了一个更加深入的了解。相信在具体的实践和创新条件下,Java内存模型也会有所改进和更新,并通过对各项功能的合理分配,来促进编程的顺利进行。
  参考文献:
  [1] 张红,王晓明,曹洁,等.Hadoop云平台MapReduce模型优化研究 [J].计算机工程与应用,2016,52(22):22-25.
  [2] Zhang Y,Feng X. An operational happens-before memory model [J]. Frontiers of Computer Science,2016,10(1):54-81.
  [3] 杨兰.计算机软件开发的JAVA编程语言及其实际应用 [J].电子设计工程,2017,25(21):49-52+56.
  [4] 陈梦凯,李小雅.基于JAVA编程的危险化学品事故预测管理模型的建立 [J].赤峰学院学报(自然科学版),2016,32(19):30-32.
  作者简介:王茂钢(1963.3-),男,汉族,四川渠县人,讲师,毕业于华南师范大学,本科,研究方向:计算机教学及应用。
转载注明来源:https://www.xzbu.com/1/view-14771221.htm