最近利用工作之余学习研究了一下java的内存管理机制,在这里记录总结一下。
1.1 java内存区域
当java程序运行时,java虚拟机会将内存划分为若干个不同的数据区域,这些内存区域创建和销毁的时间各不相同,所承担的功能也不相同,他们各司其职,各尽所责。这些区域的划分如下图
运行时数据区主要有五个区,分别是 堆 ,方法区,虚拟机栈,本地方法栈,程序计数器,下面我来一一详细讲解这五个数据区
堆
java堆是java虚拟机管理内存中最大的一块,它是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在堆分配内存。
java虚拟机规定,java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可。在实现时,既可以实现固定大小的,也可以是扩展的,可以通过配置-Xmx和-Xms来扩展大小。如果堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError
方法区
方法区也是被所有线程共享的一块内存区域,在Java虚拟机规范中,方法区是堆的逻辑组成部分,但他又被与堆区分开来,别名称为Non-Heap,它