Java内存分析

  内存分析

        这次学习Java,第一次接触内存中的程序的具体执行过程。感觉理解内存中数据的进出对程序的理解确实很有帮助。

        Java的执行过程在内存中一共占四个区域:

        heap (堆)区:用来存放new出来的东西,是一个对象的真正存放位置。堆用于动态分配和释放程序所使用的对象。

        stack (栈)区:用来存放局部变量,一般是对象的引用。

        data segment 区:用来存放静态变量和字符串常量(只是常量,new出来的String对象还是在heap中)。

        code segment 区:存放要执行的代码(函数,语句)。

      执行步骤:程序开始执行使,首先将要执行的代码从硬盘Load到内存中的code segment区中,然后找到main方法开始执行,执行过程根据语句中的变量的类型分配不同的内存空间。

举例:

程序代码:

  1. public class Cat{
  2. private static int sid= 0;
  3. private String name;
  4. int id;
  5. Cat(String name){
  6. this.name=name;
  7. id=sid++;
  8. }
  9. public static void main(String[] args){
  10. Cat.sid= 100;
  11. Cat mimi= new Cat( "mimi");
  12. }
  13. }

执行过程,1 将代码加载到code segment区,

                    2 开始执行main方法,在data segment中创建静态变量sid,值为100,

                       在栈中创建局部变量"mimi”,其指向堆的的真正new的对象。在data segment中创建字符常量"mimi"。

                    3 开始执行构造函数,Cat有一个参数,是局部变量,所以在栈中创建局部变量"name",其指向data segment中的"mimi",在堆中创建mimi的真正内容,包括name,也指向data segment中的"mimi",   还有id,值为100,然后data segment中的sid+1=1=101。构造函数执行结束,释放栈中的局部变量name。

                       内存如图:

                      

                    4 然后回到main函数,main函数结束。释放所有内存。

posted @   码海兴辰  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示