Java内存结构

Java内存结构

1,概述

1.1,为什么要学习Java内存区域

首先Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内 存控制权利交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存 的,那么排查错误将会是一个非常艰巨的任务。

Java的内存结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChNJufwT-1675755809669)(E:\JavaIDEA\Java学习资源\java学习\20221029-JavaSE-课件\图示\java内存图.png)]

2,Java中的内存分配

Java内存分配图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHTsXqvg-1675755809671)(E:\20091206数计学院高智华\20210410095102.png)]

​ 存放的是局部变量

​ 局部变量:在方法定义中或者方法声明上的变量都是局部变量

虚拟机栈(VM Stacks)

​ Java虚拟机栈是线程私有的,它的生命周期和线程是相同,描述的是Java方法执行 的内存模型。

​ Java内存可以粗糙的区分为堆内存(Heap)和栈内存(Stack),其中栈就是现在说的虚拟机栈,或者说 是虚拟机栈中局部变量表部分。 局部变量表主要存放了各种的数据类型(boolean、byte、char、short、int、float、 long、double)、对象引用等。

栈帧

​ 栈帧是栈的元素(是用于支持虚拟机进行方法调用和方法执行的数据结构)。每个方法在执行时都会创建一个栈帧。栈帧中存储了局部变量表、操作数栈、动态连接和方法出口等信息。每个方法从调用到运行结束的过程,就对应着一个栈帧在栈中压栈到出栈的过程。只有栈顶的方法是正在执行的方法。一个线程有一个栈区,不同线程有它自己的栈区。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6DrKdTp-1675755809672)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20221103202131012.png)]

本地方法栈(Native Method Stack)

​ 同虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行Java方法 (也就是字节码)服 务,而本地方法栈则为虚拟机使用到的Native方法服务。

​ Java虚拟机所管理的内存中最大的一块,Java堆是==所有线程共享==的一块内存区域,在虚拟机启动时创 建。此内存区域的唯一目的就是存放对象实例(通俗的讲就是 存放的是所有new出来的东西),几乎所有的对象实例以及数组都在这里分配内存。

​ 当栈中的弹出无人再使用时,堆中的内容由java中的垃圾回收进行回收释放!

特点:
a: 每一个new出来的东西都会为其分配一个地址值。
b: 每一个变量都有一个默认的值
byte,short,int,long – 0
float,double – 0.0
char – ‘\u0000’
boolean – false
引用数据类型 – null
c: 使用完毕就变成了垃圾,等待垃圾回收器对其回收

方法区

​ 方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静 态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但 是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

PC 寄存器

寄存器存储指令相关的现场信息,CPU只有把数据装在到寄存器才能运行。每个线程都有一个独立的PC寄存器。

寄存器存储指令相关的现场信息,CPU只有把数据装在到寄存器才能运行。每个线程都有一个独立的PC寄存器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值