JAVA虚拟机(JVM):内存模型

目录

 

一、基础概念:

二、JDK8以后的JAVA内存模型

(一)线程私有部分

(二)线程共享部分:

(三)内存模型中堆和栈的区别:

(四)元空间、堆、线程独占部分间的联系——内存角度


一、基础概念:

1.内存简介:

JAVA虚拟机(JVM):内存模型_第1张图片

2.地址空间划分:

JAVA程序是运行在内存里的,内存是需要将逻辑地址映射成物理地址,寻址空间会分成内核空间和用户空间,JAVA的程序用的是用户空间。

不同位数的系统,寻址空间不同

JAVA虚拟机(JVM):内存模型_第2张图片

 

3.JVM架构图:

包含四个部分:

JAVA虚拟机(JVM):内存模型_第3张图片

二、JDK8以后的JAVA内存模型

                         线程私有部分:                                       线程共享部分

JAVA虚拟机(JVM):内存模型_第4张图片JAVA虚拟机(JVM):内存模型_第5张图片

(一)线程私有部分

1.程序计数器(Program Countere Register)

JAVA虚拟机(JVM):内存模型_第6张图片

由于只是记录行号,程序计数器不会发生内存泄露

2.java虚拟机栈(Stack)

JAVA虚拟机(JVM):内存模型_第7张图片

(1)虚拟机栈会有多个栈帧

(2)每个栈帧存储了:

1.局部变量表(包含方法执行过程中的所有变量)
2.操作栈(入栈出栈交换复制等操作)
3.动态链接
4.返回地址

(3)每调用一个方法就会在虚拟机栈中产生一个栈帧,当递归次数过多超过栈帧深度,或者是申请的内存不够会出现栈溢出异常
 

栈 的内存为什么不需要GC去回收?

栈有固定的容量,由多个栈帧组合起来。
在编写代码时,每调用一个方法,JAVA虚拟机就会在内存分配一块空间,这块空间就是对应的栈帧。
方法结束后,对应的栈帧就会被自动释放掉。

 

3.本地方法栈

与虚拟机栈相似,只不过是标注了native的方法。

(比如forName,用的是本地方法栈)

(二)线程共享部分:

1.元空间

(1)元空间(MetaSpace)与永久代(PermGen)的区别

JAVA虚拟机(JVM):内存模型_第8张图片

(2)MetaSpace相比PermGen的优势

JAVA虚拟机(JVM):内存模型_第9张图片.

(3)存储

虚拟机加载的类信息

静态变量

即时编译后的代码

注:jdk7之后常量池移动到了堆中,以前是存在permGen中,jdk8后永久代取消

 

2.JAVA堆

(1)存储

被所有线程共享的空间

JAVA虚拟机(JVM):内存模型_第10张图片

(2)JVM三大性能调优参数

-Xss 规定了每个线程虚拟机栈的大小
(256K即可)

-Xms 堆的初始值
(超过初值可扩容)

-Xmx 堆能达到的最大值
(一般初始值和最大值设置成一样)

 

(三)内存模型中堆和栈的区别:

  • 管理方式:栈自动释放,堆需要GC
  • 空间大小:栈比堆小
  • 碎片相关:栈的碎片远小于堆
  • 分配方式:栈是静态和动态分配 堆只支持动态分配
  • 效率:栈的效率比堆高

注:引用对象数组时候,栈定义变量保存堆中目标的首地址

 

(四)元空间、堆、线程独占部分间的联系——内存角度

尚未理解:

JAVA虚拟机(JVM):内存模型_第11张图片

JAVA虚拟机(JVM):内存模型_第12张图片

线程独占:

MAIN线程会分配对应的虚拟机栈,本地栈,以及程序计数器。

栈里面会存有spring类型的 引用参数,对应地址引用

还有”hw”保存堆中helloWorld中这个地址的引用

此外,还有局部变量a,保存的是 1 这个值,以及系统自带的linNo,用来记录代码的执行

 

 

JAVA虚拟机(JVM):内存模型_第13张图片

还能添加

JAVA虚拟机(JVM):内存模型_第14张图片

JAVA虚拟机(JVM):内存模型_第15张图片

 

不断生成的常量池,已经将常量池挤爆了

 

也就是说,JDK6的时候,永久代是存在的,并且永久代里面是有字符串常量池的

 

使用JDK6+,,将常量池从永久代移动到堆内存之后,异常得到了避免

字符创常量池不受永久代的约束

 

JAVA虚拟机(JVM):内存模型_第16张图片

在JAVA 堆中去创建一个字符串“a

JAVA虚拟机(JVM):内存模型_第17张图片

比较的是地址

在JDK8中

在JDK6中

 

在引号中声明的字符串都会在字符串常量池中创建出来,而new出来的这些Spring对象,都会在java heap创建出来 , 所以两个地址不会相等。

JAVA虚拟机(JVM):内存模型_第18张图片

 

JAVA虚拟机(JVM):内存模型_第19张图片

再次回顾,则知道原因:

JAVA虚拟机(JVM):内存模型_第20张图片

JAVA虚拟机(JVM):内存模型_第21张图片

JAVA虚拟机(JVM):内存模型_第22张图片

 

 

你可能感兴趣的:(JAVA进阶知识)