java内存管理
java内存分成两种:
(1)栈内存
基本数据类型的变量和对象的引用变量都存在于函数的栈内存中。
生命周期:方法A中调用了方法B,那么方法B中包含b变量,当函数B运行完成后变量b会被自动销毁,分配给它的内存会被jvm回收。
(2)堆内存
堆内存用于存储new创建的对象和数组,在堆中分配的内存,由java
java内存具体细节
java内存细分的话可以分为5个部分:
- 方法区域
- 虚拟机栈
- 本地方法栈
- 堆
- 程序计数器
程序计数器
首先来看程序计数器,是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
在虚拟机工作的过程中,字节码解释器工作时就是通过改变这个计数器的值来选取,下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。因为程序在执行的时候是并发执行的,所以为了保证线程切换后能够恢复到正确的执行位置,每个线程都是需要一个独立的程序计数器。
java虚拟机栈
每一个方法执行的时候都会同时创建一个栈帧用于存储方法中的局部变量表,操作栈、动态链接、方法出口等信息。每个方法的 整个执行过程对应一个栈帧在虚拟机中从入栈到出栈的操作过程。
对于虚拟机的栈主要用于存储基本数据类型,对象引用。
注意:其中64位的long和double类型的数据会占用2个局部变量空间(slot),其余的数据类型只占用1个。
本地方法栈
本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行java方法服务,而本地方法是为虚拟机执行调用本地方法服务。
java堆
对于大多数应用来说,java堆是Java虚拟机内存管理中最大的一块。java堆是被所有线程共享的一块内存区域,其唯一的目的是存储对象的实例。也是垃圾收集器管理的主要区域,
方法区
它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等