JVM_内存管理(一)

java有两大机制:jvm机制和GC机制

本文主要讲解jvm中的内存管理模块的内容:

首先,java程序是运行在jvm平台上的,因为jvm跨平台的特性,吸引了各开发者的青睐,jvm也得到了快速发展,如今jvm上的混合语言编程也成为jvm之后版本更新的趋势之一。

java开发者不同于c和c++开发者,c和c++开发者需要控制每个对象的生命周期(创建、销毁),java开发者一般不需要控制对象的销毁,因为jvm的GC机制会自动回收没有引用的对象。但是,如果了解jvm的内存分配,我们就会更好的设计和编写程序。

一、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_内存管理(一)

栈:

JVM_内存管理(一)

方法区:

JVM_内存管理(一)

 

 

关于jvm的内存回收,下一篇文章有详细介绍