java 内存的分配

来源:互联网 发布:福建广电网络机顶盒 编辑:程序博客网 时间:2024/05/29 17:54

java 内存的分配

方法区

在编译时就分配好内存,在程序运行期间都存在。
主要存放静态数据和一些常量

栈区

函数的局部变量会在栈上创建,函数执行结束时这些存储单元就会被自动释放。
栈内存分配的运算速度很快,因为内置在处理器里面,容量有限(比如1M)

  • 每个线程包含一个栈区,栈中只保存基本数据类型和局部对象的引用(不是对象),对象的实体都放在堆区中。
  • 每个栈中的数据(基本数据类型和对象引用)都是私有的,其他栈不能访问。

堆区

可以用new来申请分配内存。
jvm只有一个堆区(heap)被所有线程共享。堆中存放所有的成员变量,以及局部变量的对象实体。

区别

栈是一块连续的内存区域,大小由操作系统决定 (相当于物流的仓库),
栈是先进先出,进出完全不会产生碎片,运行效率高且稳定。
堆是不连续的内存区域,堆内存比较灵活,但管理很麻烦,
频繁new/remove会造成大量的内存碎片,这样就会慢慢导致效率低下。

示例

public class Main {    int a = 1; //堆里面    Student s = new Student(); //堆里面    public void XXX() {        int b = 1; //栈里面        //引用在栈里面,引用对象在堆里面        Student s2 = new Student();    }}  
  1. 成员变量全部存储在堆中(包括基本数据类型,引用和引用的对象实体)
  2. 局部变量的基本数据类型和引用存储于栈中,引用的对象实体存储在堆中
原创粉丝点击