jvm的内存模型

参考了很多文章 ,记录下自己对jvm模型的了解,先分享下内存模型

 java

中通过多线程机制使得多个任务同时执行处理,所有的线程共享JVM内存区域main memory,而每个线程又单独的有自己的工作内存,当线程与内存区域进行交互时,数据从主存拷贝到工作内存,进而交由线程处理(操作码+操作数)

程序启动时C++程序通过调用底层jvm库文件创建虚拟机,虚拟机会加载一个引导类加载器实例(Launcher)进而加载创建其他类加载器。类的加载机制大致流程为

加载:   从磁盘上读取字节码文件,使用到类时才会加,例如调用类的main方法 new对象等等,在加载阶段这个类会在内存中生成一个class对象作为方法区这个类的各种数据的访问入口

验证:   校验字节码文件的正确性

解析:  将符号引用替换成直接引用,该阶段会把一些静态方法(符号引用,比如说main方法)替换成指向数据所在的内存指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成)动态链接是程序运行期间完成的将符号引用直接替换成直接引用

初始化:  对类的静态变量初始化为指定的值,执行静态代码块

我们现在来逐个的看下每个到底是做什么的!

五大内存区域

1:程序计数器:(Program Counter Register)线程私有

 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码执行引擎就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

为什么要有程序计数器呢?

由于java虚拟机的多线程是通过线程切换分配处理器执行时间的方式实现的,对于一个处理器(如果是多核cpu那就是一核)在一个确定的时刻都只会执行一条线程中的指令,一条线程中有多个指令,为了线程切换可以恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,各线程之间的计数器互不影响,独立存储。

2: 栈 (Java Virtual Machine Stacks)(虚拟机栈  线程栈)线程私有

虚拟机栈它的生命周期和线程相同。每个方法被执行的时候都会创建一个栈帧(Stack Frame) 用于存储局部变量表,操作栈,动态链接和方法出口等信息。每一个方法被调用直至执行完成的过程,就对应一个栈帧在虚拟机栈从入栈到出栈的过程

2.1:局部变量表:一片连续的内存空间,用来存放方法参数,以及方法内定义的局部变量。存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double),对象引用(reference类型,它不等于对象本身,对象本身一般都是放到堆中,根据不同虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个对象的句柄或其他与此对象相关的位置)和returnAdress类型(指向了一条字节码指令的地址)

2.2:操作数栈:存放操作数,在这个内存空间用来操作计算

2.3:动态链接:程序运行期间完成的将符号引用直接替换成直接引用

2.4:方法出口:方法执行完需要把结果返回对应java的return方法

3:本地方法(Native Method Stacks)

虚拟机使用到的native方法服务,底层调用的c或者c++

4:堆(Java Heap)

对于大多数应用来说,堆是java虚拟机管理内存最大的一块区域。在虚拟机启动的时创建,此区域几乎所有的对象实例都在这里分配内存。jvm调优说的就是对该区域内存调整。

 5:方法区(Method Area)

与java堆一样,是各个线程共享的内存区域,它用于存放已被虚拟机加载的类信息,常量,静态变量,即时编译器编译的代码等数据。为了区分堆,又称为非堆。在老版本jdk,方法区也被称为永久代【因为没有强制要求方法区必须实现垃圾回收,HotSpot虚拟机以永久代来实现方法区,从而JVM的垃圾收集器可以像管理堆区一样管理这部分区域,从而不需要专门为这部分设计垃圾回收机制。不过自从JDK7之后,Hotspot虚拟机便将运行时常量池从永久代移除了。】根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值