JAVA 堆内存、栈内存、方法区

java内存

  • 栈区
      • (一)基本数据类型的变量
      • (二)对象的引用变量
      • 优缺点
  • 堆区
      • 存放由new创建的对象和数组
      • 优缺点
  • 方法区/静态区

JAVA 堆内存、栈内存、方法区_第1张图片

栈区

由编译器自动分配释放 ,存放函数的参数值,局部变量的值等

(一)基本数据类型的变量

如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。

另外,存在栈中的数据可以共享。假设我们同时定义

int a=3;
int b=3;

先在栈中创建变量a的引用,然后,查找有没有字面值为3的地址,没找到就开辟一个存放3的地址,然后将a指向3的地址。
接着,int b=3; 在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。
JAVA 堆内存、栈内存、方法区_第2张图片

(二)对象的引用变量

String s=new String();

当在代码块中定义一个变量时,Java就在栈中为这个变量分配内存空间;当超过变量的作用域后,Java会自动 释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

优缺点

优点:
存取速度快;栈中的数据可以共享
缺点:

堆区

可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),在java中,所有使用new xxx()构造出来的对象都在堆中存储一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。

存放由new创建的对象和数组

优缺点

优点:

  • 可以在程序运行时,动态的分配内存大小

缺点:

  • 由于动态分配内存,所以存取速度慢

方法区/静态区

方法区包含所有的class和static变量。跟堆一样,被所有的线程共享

方法区
线程共享? 线程私有
分配 程序员分配 编译器自动分配
存放内容 对象实例、数组 基本数据类型、对象引用 虚拟机加载的类信息、常量、静态变量、即时编辑后的代码等数据

你可能感兴趣的:(Java)