详解Java 中程序内存的分析

发布时间 - 2026-01-11 00:47:29    点击率:

这篇文章将简单的说明下当我们运行Java程序时JVM(Java虚拟机)的内存分配情况。

首先我们先来感观的认识下几个名词:

1、栈,一般来说,基本数据类型直接在栈中分配空间,局部变量(在方法代码段中定义的变量)也在栈中直接分配空间,当局部变量所在方法执行完成之后该空间便立刻被JVM回收,还有一种是引用数据类型,即我们通常所说的需要用关键字new创建出来的对象所对应的引用也是在栈空间中,此时,JVM在栈空间中给对象引用分配了一个地址空间(相当于一个门牌号,通过这个门牌号就可以找到你家),在堆空间中给该引用的对象分配一个空间,栈空间中的地址引用指向了堆空间中的对象区(通过门牌号找住址);

2、堆,一般用来存放用关键字new出来的数据。

接下来我们再通过一段程序来直观感受下程序运行时JVM的内存情况,

package demo;

public class Student {
  private String name;
  private int age;

  public void study() {
    System.out.println("I love study!");
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}
package demo;

public class StudentDemo {
  public static void main(String[] args) {
    Student student = new Student();

    System.out.println(student.getName() + ":" + student.getAge());
    student.setName("John");
    student.setAge(23);
    System.out.println(student.getName() + ":" + student.getAge());
    
    student.study();
    
    Student student2 = student;
    student2.setName("Jack");
    student2.setAge(25);
    System.out.println(student2.getName() + ":" + student2.getAge());
    System.out.println(student.getName() + ":" + student.getAge());
  }
}

当我们运行程序时,JVM会把Student类与StudentDemo类编译完然后加载到JVM中一个叫方法区的地方,类的成员变量与成员方法也被加载到方法区中,此时内存模型如下

可以看到study方法右边各有一个16进制的标记,而name与age变量没有,这是因为每个对象都有各自的成员变量,而类中的成员方法却可以被每个对象所共用,为了节省内存空间,JVM为方法分配了该标记(也叫内存地址)便于每个new出来的对象查找调用,接着JVM会自动寻找main方法,在栈中为main方法申请一个空间,这个过程也叫入栈,然后执行我们Student类中第5行代码,这时候,JVM在堆空间中分配一块内存给Student对象,并为其分配一个内存地址(如果对象的成员变量没有赋值,则JVM会为变量赋初始值),在栈中分配一块内存空间用于指向堆空间中的Student对象区的内存地址,此时内存模型如下

接着看代码第8行与第9行,程序为student对象的成员变量赋值,JVM会根据student所指向的地址在堆内存中寻找Student类的变量,并为变量赋新的值

第12行,这时student对象调用study方法,JVM在栈空间中为study方法申请了一块内存空间

study方法执行完后,立即释放栈空间,代码第14行,student2对象的引用指向了student所指向的地址

代码15与16行,为student2的变量赋值,由于student2与student指向了同一个地方,所以这时student对象中变量的值也被改变

到这,main方法中所有代码执行完毕,main方法所占用的栈空间也被回收,而堆空间等待GC回收

代码执行结果如下:

null:0
John:23
I love study!
Jack:25
Jack:25

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java  # 程序内存  # 中程序内存详解  # 中程序内存分析  # Java面向对象编程(封装/继承/多态)实例解析  # 全方位讲解Java的面向对象编程思想  # Java基础教程之Hello World到面向对象  # java实现学生管理系统(面向对象)  # Java中面向对象的知识点总结  # Java面向对象的三大特征  # 深入java内存查看与分析详解  # 深入分析Java内存区域的使用详解  # Java面向对象和内存分析图文详解  # 当我们  # 也叫  # 中为  # 类中  # 配了  # 加载  # 几个  # 是在  # 都有  # 也在  # 希望能  # 可以看到  # 为其  # 各有  # 会把  # 这篇文章  # 一个叫  # 谢谢大家  # 并为  # 这是因为 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel如何使用withoutEvents方法临时禁用模型事件  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  原生JS获取元素集合的子元素宽度实例  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel安装步骤详细教程_Laravel环境搭建指南  清除minerd进程的简单方法  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  浅谈redis在项目中的应用  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Java垃圾回收器的方法和原理总结  Laravel如何使用Gate和Policy进行授权?(权限控制)  网站制作壁纸教程视频,电脑壁纸网站?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  如何为不同团队 ID 动态生成多个非值班状态按钮  简历没回改:利用AI润色让你的文字更专业  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何快速搭建安全的FTP站点?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何利用DOS批处理实现定时关机操作详解  Python文件操作最佳实践_稳定性说明【指导】  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  QQ浏览器网页版登录入口 个人中心在线进入  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  SQL查询语句优化的实用方法总结  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Android滚轮选择时间控件使用详解  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  如何用y主机助手快速搭建网站?  phpredis提高消息队列的实时性方法(推荐)  如何快速搭建高效可靠的建站解决方案?