JVM的内存机制

本文详细探讨了Java虚拟机(JVM)的内存布局,包括栈区的栈帧原理、堆区的共享特性与垃圾回收机制,以及方法区的常量池和类加载。重点讲解了基本数据类型、数组和对象在内存中的存储方式,以及String类和静态变量的内存分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM的内存机制:JVM运行在计算机内存上,占用计算机内存空间,执行Java字节码文件!

在JVM(Java虚拟机)中,每个应用程序拥有一个独立的JVM实例,每个JVM实例都是一个独立的进程,拥有自己的内存空间、线程和资源。这意味着每个应用程序在JVM中都是相互隔离的,它们之间不会相互干扰。
!!!每个线程都有属于自己唯一的栈区,一个栈区代表一个线程!!!

并分为3个区:1.栈区;2.堆区;3.方法区

JVM内存图:请添加图片描述

1.栈区:栈帧是先进后出,后进先出

  1. JVM的栈由许多栈帧组成,每调用一个方法(main方法或者其它方法),JVM就压入一个新的栈帧到栈中。
  2. 创建!!!方法中的 基本数据类型的局部变量和其对应数值引用数据类型实例化变量(是对象的名字,用来存储堆空间对象的堆地址)和其在堆中对应的地址,且变量和实例化对象有一一对应的栈帧地址。
  3. 当该方法返回时,这个栈帧就从栈中弹出, 其中的局部变量就会被销毁!!!

请添加图片描述

2.堆区(运行时数据区):

  1. JVM只有一个堆,被所有线程共享,开辟空间并存储引用数据类型对象(类,数组等)
  2. 数组在堆中存储的是数组对象并将其数组元素存放在数组对象的空间中,并返回数组的首地址给栈中的数组变量;
  3. 类在堆中存储的是实例化对象并将其成员变量构造方法成员方法存放在实例化对象的空间中且有一一对应的堆地址,并返回其堆地址给栈区的对象变量;
  4. 对象在堆中存储模式为::在堆中开辟一个空间存储对象,且对应一个堆地址,并将其对象的信息存储在这个开辟的空间中,且每一条信息在开辟的空间中对应一个地址
  5. 堆中的垃圾来源:当程序运行在栈中的引用变量作用域之外时,引用变量在栈中会被释放,但是引用变量在堆中对应的对象或数组占用的空间并不会释放,当没有引用变量指向堆中的对象或数组时,这时候就成了堆中的垃圾,且不能使用,但是占堆中的内存,当然,在后面会被垃圾回收期释放掉,但是其时间不确定,这也是Java比较占内存的原因。
  6. 在jdk1.8后,静态变量区(存储static修饰的变量)和运行时常量池中的字符串常量池放在了堆中!
    请添加图片描述

3. 方法区:

方法区逻辑上属于堆的一部分,与堆地址相连,但是为了与堆进行区分,通常又叫“非堆”。不同的Java版本有不同的实现。方法区为所有线程共享。

  1. 方法区包含运行时常量池加载类信息
  2. 常量池
  • 常量池分为静态常量池(.class文件)运行时常量池(类加载后存放静态常量池的内容)
  • 运行时常量池用来存放方法中的常量数据(final修饰符)
  • 如果变量为String类型,为引用数据类型,会将其数据存放在字符串常量池(运行时常量池中一部分,用于存储字符串)中(堆内存)。
  1. 加载类信息:将程序所有的类(main类或其它的类)的信息(类的属性信息,方法信息)加载进方法区的加载类信息的内存区域中!
    请添加图片描述

个人学习总结区

1. 基本数据类型内存分析
请添加图片描述

2. 一维数组内存分析
请添加图片描述

3. 二维数组内存分析
请添加图片描述

4. 对象内存分析
请添加图片描述

5.String类对象的内存分析
请添加图片描述6. 静态变量内存分析:为所有线程共享,可以使用类名.变量名调用
请添加图片描述

转载自joshua317博客 Java 类和对象在内存中的表现形式,栈、堆、方法区、常量池 - joshua317的博客,点击跳转其文章!
如有错误或侵权,望您联系我进行修改或下架,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值