JVM_内存管理(一)
java有两大机制:jvm机制和GC机制
本文主要讲解jvm中的内存管理模块的内容:
首先,java程序是运行在jvm平台上的,因为jvm跨平台的特性,吸引了各开发者的青睐,jvm也得到了快速发展,如今jvm上的混合语言编程也成为jvm之后版本更新的趋势之一。
java开发者不同于c和c++开发者,c和c++开发者需要控制每个对象的生命周期(创建、销毁),java开发者一般不需要控制对象的销毁,因为jvm的GC机制会自动回收没有引用的对象。但是,如果了解jvm的内存分配,我们就会更好的设计和编写程序。
一、jvm内存模型:
如图:
java内存模型大致分文5个部分
1、程序计数器
- 是jvm管理的内存中最小的一块区域;是当前线程所执行字节码指令的行号指示器(位置)
- java的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,在任意一个确定的时刻,一个处理器(多核处理器的一个内核)只执行一条线程的指令。
- 为了切换线程后能够回到正确的执行位置,每个线程都有一个独立的程序计数器,用于指定字节码指令的位置,各个线程之间的计数器互不影响,相互独立,因此也称为“线程私有”的内存
- 如果线程正在执行java方法,则程序计数器中存放的是所执行字节码指令的地址;如果执行的是Native方法,则存放的是空(undefined)
- 程序计数器是jvm规范中规定的唯一不存在任何OutOfMemoryError情况的内存区域
2、jvm栈
- java虚拟机栈描述的是java方法执行时的内存模型:每个方法被执行的时候都会创建一个栈帧(stack frame),用于存储方法局部变量表(包括方法的参数)、操作数栈、动态链接、方法出口等信息。
- 栈帧的生命周期:每个方法从被调用直到执行完成,对应栈帧在java虚拟机栈中的入栈和出栈。
- 如果线程请求的栈深度大于虚拟机规定的栈深度,会抛出StackOverflowError异常;如果jvm可以扩展,扩展时不能申请足够的内存空间,会抛出OutOfMemoryError异常
3、方法栈
方法栈类似于jvm栈,不同之处在于:jvm栈是为jvm执行java方法(字节码)的服务,方法栈是为jvm使用的Native方法服务
4、java Heap 堆
- java堆是java虚拟机管理的内存中最大的一块区域
- 唯一目的是存放对象实例,java虚拟机规范中规定:所有的对象实例和数组在堆上分配
- 堆还是垃圾收集器管理的主要区域,也称“GC堆”(关于回收的内容,下一篇文章有介绍)
- 如果堆无法为对象实例申请到足够的内存空间,将会抛出OutOfMemoryError异常
5、方法区
- 用于存放已被jvm加载的类信息、常量、静态变量、类中的方法等,即.class字节码文件
- 当方法区无法满足内存分配的需求时,抛出OutOfMemoryError异常
二、对象访问
堆:
栈:
方法区:
关于jvm的内存回收,下一篇文章有详细介绍