JAVA内存管理,java什么管理内存
目录
关于自动内存管理Java由jvm管理,包括自动分配和自动回收,所以不容易出现内存泄漏和内存溢出。C/C,程序员手工管理内存,手工完成:使用前申请内存,使用后释放。2运行时数据区Java虚拟机在执行Java程序的过程中,会将其管理的内存分成几个不同的数据区。这些地区都有自己的目的,以及创造和毁灭的时间。
Java虚拟机管理的内存包括以下运行时数据区:
2.1程序计数器程序计数器:存储当前线程执行的字节码指令的内存地址。字节码解释器通过改变这个计数器的值来选择下一个要执行的字节码指令。[查找下一条要由PC执行的指令]。计数器是线程私有的。Cpu通过轮流分配时间片来执行线程。为了在线程切换后恢复到正确的执行位置,显然每个线程都需要一个独立的程序计数器。如果线程正在执行Java方法,PC记录正在执行的字节码指令的地址;如果正在执行本机方法,此计数器值应该为空。【todo中局部方法为什么为空】2.2虚拟机堆栈虚拟机堆栈描述了Java方法执行的线程内存模型:每执行一个方法,jvm都会同时创建一个堆栈框架【后续章节详细解释】(stack frame)存储局部变量表、操作数堆栈、动态连接、方法出口等信息。虚拟机堆栈也是线程私有的,其生命周期与线程相同。2.2.1在JDK8之前,jvm内存的知识只停留在堆内存和栈内存,而“栈”在这里通常指的是虚拟机栈,或者更多的时候,只是指虚拟机栈的局部变量表部分。局部变量表存储:基本数据类型(八种:boolean、byte、char、short、int、float、long、double)、对象引用(可能是指向对象起始地址的引用指针)和返回地址类型(指向一个字节码指令的地址)。局部变量表所需的内存空间是在编译过程中分配的。在进入一个方法时,该方法需要在堆栈框架中分配多少局部变量空间是完全确定的,在方法运行过程中局部变量表的大小不会改变。【这里的大小只是变量槽的个数】局部变量表使用局部变量槽来存储数据,其中64位的long和double数据会占用两个变量槽,其他数据类型只占用一个。(通常一个槽占用N个字节,N的大小由不同的虚拟机实现决定)。堆栈的内存数据分析将在后续章节中进一步分析,本节这里只介绍概念。
2.2.2操作数栈:调用方法时的推栈原理,将在《深入理解计算机系统》系列笔记的后续章节中总结。
2.3原生方法栈(Native method stack)与虚拟机栈非常相似,区别在于虚拟机栈为虚拟机执行Java方法(即字节码)服务,而原生方法栈服务的是虚拟机使用的原生方法。线程私有。2.4堆Java堆(Java Heap)存储对象的实例。Java堆是线程共享的大内存区域,是在虚拟机启动时创建的。Java堆可以是固定大小的,也可以是可扩展的,但是目前主流的Java虚拟机都是可扩展的(由参数-Xmx和-Xms设置)。可弹性伸缩,但不超过设定的最大容量。如果Java堆中没有内存来完成实例分配,并且堆不能再扩展,Java虚拟机将抛出OutOfMemoryError异常。Java堆可以在一个物理上不连续的内存空间中,但是逻辑上应该被认为是连续的。2.5方法区(Method area)方法区存储由虚拟机已经加载的类的即时编译器编译的类型信息、常量、静态变量和代码缓存等数据。方法是线程共享。方法区不需要连续内存,大小可以固定,也可以扩展,甚至可以选择不实现垃圾回收(因为这部分内存通常不满足回收条件)。当方法区不能满足新的内存分配要求时,就会抛出OutOfMemoryError异常。2.5.1运行时常量池存储编译时产生的各种文字量和符号引用。运行时常量池是方法区域的一部分。3直接记忆。首先,直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区。它可能会导致OutOfMemoryError异常,所以有必要了解一下。在JDK 1.4中,新增了NIO(New Input/Output)类,并引入了基于通道和缓冲区的I/O方法。它可以通过使用原生函数库直接分配堆外的内存,然后通过使用Java堆中存储的DirectByteBuffer对象作为对这个内存的引用来进行操作。在某些情况下,这可以显著提高性能,因为它避免了在Java堆和本机堆之间来回复制数据。
显然,原生直接内存的分配不会受到Java堆大小的限制。但既然是内存,那么肯定会受到总的本机内存(包括物理内存、交换分区或分页文件)大小和处理器寻址空间的限制。在配置虚拟机参数时,一般服务器管理员会根据实际内存设置-Xmx等参数信息,但往往会忽略直接内存。使每个内存区域的总和大于物理内存限制(包括物理和操作系统级别限制),导致动态扩展时出现OutOfMemoryError异常。深入的记忆知识会在《深入理解计算机系统》系列笔记后续章节中总结。
4总结Java内存区域及其数据类别的概述:
版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。