1.运行时数据区
java虚拟机在执行java程序的过程中会爸它所管理的内存分为若干个不同的数据区域
jvm内存主要分为堆、程序计数器、方法区、虚拟机栈喝本地方法栈,直接内存等。
java方法的运行和虚拟机栈
虚拟机栈是线程运行java方法所需要的数据,指令,返回地址。
每一个方法执行都会打包成一个栈帧。
栈是先进后出的数据结构。
栈帧四个区域
局部变量表:
操作数据栈
动态连接
返回地址
程序计数器
较小的内存空间,当前线程执行的字节码的行号指示器,各线程之间独立存储,互不影响。
由于java是多线程语言,当执行线程数量超过cpu的核心数,线程之间会根据时间片轮询cpu资源。那么退出的线程就需要一个单独的计数器去记录下一条运行的指令。它也是为一个不会oom的内存区域。所有的方法都有程序计数器(native 本地方法除外)
本地方法栈
本地方法栈跟java虚拟机栈的功能类似
方法区
提供各个线程共享的运行时内存区域。它存储每一个类的结构信息,例如 运行时常量池字段和方法数据,构造函数和普通方法的字节码内容,类、实例、接口初始化的特殊方法、jdk 1.7 永久代 1.8元空间
运行时常量池
每一个类,接口的常量池的运行时表现形式,包括若干不同的常量,必须在运行期解析后才能获得方法或者字段的引用。
堆
是jvm内存区域中最大的一块,申请的所有对象都在堆。垃圾回收也就是回收堆。
直接内存
jvm在运行的时候,会从系统中申请大块的堆内存。
jvm运行的总体流程
jvm在操作系统上启动申请内存,先进行运行时数据区的初始化,然后把类加载到方法区,最后执行方法。方法的执行和退出过程在内存的提现上是虚拟机栈中栈帧的入栈和出栈。同时在方法的执行过程中创建的对象一般情况下是放在堆中,最后堆中的对象也是需要进行GC。