zoukankan      html  css  js  c++  java
  • 简单的java内存机制

    java内存管理不简单,这里只简单介绍栈、堆、方法区三种,用来解释java程序的运行流程。

    堆:

      用来装载java对象

    栈:

      用来装载局部变量和方法的调用,每一个方法的调用载入一块栈帧,栈信息的出入原则与子弹夹类似,先进后出。

    方法区:

      存储一些公有信息,多个对象可能共同使用的信息,方法结构、静态变量等

    使用下面程序作为例子:

    class Dog{
       String name;
       int age;
    
       public void bark(){
         System.out.println("汪汪");
       }  
    }
    
    class TestDog{
       public static void main(String[] args){
          Dog  d = new Dog();
          d.name = "大黄";
          d.age = 10;
          d.bark();  
       }
    }
    

      

    1、装载类,方法区中有Dog类的方法信息

    2、装载main方法,栈帧中出现main栈帧

    3、执行new Dog赋值给d,堆中创造0x001对应对象连接到d,并且属性初始化值

     4、d对象给name、age属性赋值,对象的成员变量值存储到对象中,方法不存储,引用数据类型存储的是引用地址

    5、执行到bark()方法,在占中加入bark的栈帧,cpu执行权转到bark,输出汪汪

     6、bark方法执行完毕,bark栈帧移除,cpu再次回到main方法

    7、main方法执行完毕移除,d对象没有了对应变量连接,等待垃圾回收器处理。

    注意点:

      这里的方法调用没有参数,如果有参数的方法调用传递的参数实际上是实参的拷贝值。因为引用数据类型的值其实是对象的地址值,所以引用数据类型参数传递到方法中依旧能影响到同一个对象。

      java程序执行有寄存器,有执行指针的类似概念,每个方法执行,就需要加入栈帧,执行完毕消亡则移除栈帧,当然栈帧中的局部变量一块消亡。

      方法调用就是一种堆栈的形式,cpu永远先执行顶上的栈帧

  • 相关阅读:
    linux读写锁
    轻量级过程改进之需求开发
    Hibernate4.3.6 Final+Spring3.0.5配置出错提示及解决方法
    hdu1198Farm Irrigation(dfs找联通)
    ushare编译之 ‘struct sockaddr_storage’ has no member named ‘s_addr’
    iOS的URLScheme
    Python学习笔记(一)
    un-资源-开源-WebGallery:Windows Web App Gallery
    几何-莱罗三角形:百科
    几何-正十七边形:百科
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/12245890.html
Copyright © 2011-2022 走看看