Java内存模型

一、运行时数据区域的分区

JVM虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。

1.1运行时数据区域的划分

  • JVM虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。
  • JDK 1.8分为:线程共享Heap堆区、Method Area方法区)、线程私有(虚拟机栈、本地方法栈、程序计数器)
  • JDK 1.8分为:线程共享Heap堆区、MetaSpace 元空间)、线程私有(虚拟机栈、本地方法栈、程序计数器)

二、 程序计数器

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

2.1程序计数器主要有两个作用

  1. 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,例如 if(计数器行号)
  2. 在多线程的情况下,线程切换时因为时间片的原因,需要程序计数器用于记录当前线程执行的位置。

 三、JMM内存区域

JMM内存区域可以粗略的区分为堆内存(Heap)和栈内存 (Stack)。其中栈就是虚拟机栈中局部变量表部分。局部变量表主要指向与对象相关的位置。用于描述 Java 方法执行时的内存模型,每次方法调用的数据都是通过栈传递的。

3.1Java 虚拟机栈

Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表操作数栈动态链接方法出口信息。在局部变量表中记录了对象引用,存储方法参数和定义在方法体内的局部变量这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型只有位于栈顶的帧才是有效的, 称为当前活动栈帧,代表正在执行的当前方法。。

3.2堆

堆区也被称作GC 堆,被所有线程共享的一块内存区域。堆主要存放new出来的对象实例以及数组都在这里分配内存。JDK 1.7 开始已经默认开启逃逸分析,如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈上分配内存。

由于现在收集器基本都采用分代垃圾收集算法,所堆区进行分代划分,例如:新生代 老年代目的是更好地回收内存,或者更快地分配内存。

四、创建对象的内存分配

蓝色区域就是将一直筛选新对象,让将新对象年龄持续增加,最后进入老年代。让老年代判断是否可以存的下。

Java内存模型_第1张图片

五、元空间 

元空间用于存放类信息、常量、静态变量、JIT即时编译器编译后的机器代码等数据等。

Java内存模型_第2张图片 

六、字符串常量池 

字符串常量池

在池子中,存的到底是什么呢?答案是变量的值。

String str1 = "str";
String str2 = "ing";

String str3 = "str" + "ing"; // 常量池中的新字符串对象
String str4 = str1 + str2; // 在堆中创建的新字符串对象
String str5 = "string"; // 常量池中的已有字符串对象

System.out.println(str3 == str4); //false
System.out.println(str3 == str5); //true
System.out.println(str4 == str5); //false

你可能感兴趣的:(java,开发语言,jvm)