深入理解JVM之运行内存模型

深入理解JVM之运行内存模型

1.Jvm运行时数据区

在这里插入图片描述

线程共享数据区:方法区 堆

线程隔离数据区:Java虚拟机栈 本地方法栈 程序计数器

程序计数器

  • 程序计数器是一块较小的内存空间,看作当前线程所执行的字节码的行号指示器

  • 字节码治时期工作时事通过改变计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程回复等基础功能都需要依赖这个计数器来完成

  • 内存区域中唯一一个没有规定OutOfMemoryError情况的区域

为什么使用:为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。

Java虚拟机栈

作用于方法执行的一块区域

/**
 * @Author: iamasd
 * @Description:
 * @Date: Created in 22:392019/12/6
 */
public class Test {

    public static void a(){
        System.out.println("进入a");
    }

    public static void b(){
        a();
        System.out.println("进入b");
    }
    public static void main(String[] args) {
        b();
        System.out.println("进入main");
    }
}
  • 打印结果
进入a
进入b
进入main

Process finished with exit code 0
  • 每个方法的执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至执行完成的过程,就对应这一个栈帧再虚拟机栈中入栈到出栈的过程。
  • 局部变量表存放已知以及对象的引用和可知的基本数据类型
  • 由于是递归栈操作,会导致栈溢出操作,抛出StackOverflowError

本地方法栈

  • 作用域本地方法执行的一块java内存区域
  • 与Java虚拟机栈相同的操作
  • Hotshot将Java虚拟机栈和本地方法栈合二为一

Java堆

  • 是Java内存区域中一块用来存放对象实例的区域
  • Java堆是java虚拟机所管理内存中最大的一块,同时也是被所有线程共享的一块区域
  • GC堆

方法区

  • 是各个线程共享的区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
  • 类信息:类版本号,方法,接口
  • Hotspot使用永久代来实现方法区JRockit,IBM J9vm java堆一样管理这部分内存
  • 方法区会抛出OutofMemoryError,当他无法满足内存分配

运行时常量池

  • 方法区的一部分,用于存放编译器产生各种字面量和符号引用
  • 方法区会抛出OutofMemoryError,受到方法区内存的限制
发布了9 篇原创文章 · 获赞 3 · 访问量 443

猜你喜欢

转载自blog.csdn.net/qq_41740808/article/details/103431124