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永远先执行顶上的栈帧

  • 相关阅读:
    frida hook native -- frida hook so层 实例代码讲解
    frida hook 类所有方法(ZenTracker)
    frida hook AES DES RSA 自吐算法
    frida java层和c层打印堆栈 (修复优化)
    frida延时hook的3种方法
    [去广告]x米万能遥控 去掉底部banner广告
    Linux使用C语言连接MYSQL
    Linux一对一通信(UDP)
    Linux一对多的通信
    Linux一对一的通信
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/12245890.html
Copyright © 2011-2022 走看看