java学习笔记13:内存分析详解_栈_堆_方法区_栈帧_程序执行的内存变化过程

面向对象的内存分析

java虚拟机的内存可以分为三个区域:
  栈(stack)、堆(heap)、方法区(method area)

栈的特点如下:
  1、栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
  (核心作用)
  2、JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
  3、栈属于线程私有,不能实现线程间的共享!
  4、栈的存储特性是“先进后出,后进先出”
  5、栈是由系统自动分配,速度快!栈是一个连续的内存空间!

堆的特点如下:
  1、堆用于存储创建好的对象和数组(数组也是对象)(new的时候,是在堆里创建好了对象)
  2、JVM只有一个堆,被所有线程共享
  3、堆是一个不连续的内存空间,分配灵活、速度慢!

方法区(又叫静态区),特点如下:
  1、JVM只有一个方法区,被所有线程共享!
  2、方法区实际也是堆,只是用于存储类、常量相关的信息!
  3、用来存放程序中永远不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
java学习笔记13:内存分析详解_栈_堆_方法区_栈帧_程序执行的内存变化过程_第1张图片
java学习笔记13:内存分析详解_栈_堆_方法区_栈帧_程序执行的内存变化过程_第2张图片
如:
  1、调用虚拟机执行这个类,程序从main方法开始执行,首先在堆中的方法区中加载类的相关信息;
  
  类的相关信息包括:
    1、代码
    2、静态变量
    3、静态方法
    4、字符串常量
    …等等
    
  2、运行主方法,在栈中建立一个main方法的栈帧,类型为S的局部变量s,目前为空;
  
  3、主方法运行,需要new一个对象,调用了类的构造器方法S(),因此建立了新的栈帧(构造器方法的栈帧);
  
  4、通过执行构造器方法,在堆中创建了这个S类的对象;
  
  5、构造器执行完毕,在堆中新创建好了对象,栈中的构造器栈帧关闭销毁;
  (现在在堆中新建的对象属性为默认值,数值为0,引用的数据类型为null,还有相关的方法)
  
  6、通过执行赋值符号,把建好的对象给变量s;
  建好的每个对象都有地址,(堆中有很多内存块,建好的、每一个内存块都有一个地址),如:
    S s = new S();  //创建一个对象
    System.out.println(s);  //可在控制台打印对象s,可知堆中内存块的地址,每次都不一样
    
   即,把新建的内存地址通过赋值符号赋给对象s,就把栈中的类型为S的局部变量s与堆中新建的内存块相关联起来,因此对象s可根据内存地址找到属于自己的信息,我们也因此可以打点调用

注:绝大多数语言底层都类型,掌握了内存分析,对理解程序的运行和学习其他语言有很大帮助
  内存执行完一个都会删除一个

你可能感兴趣的:(java学习笔记)