关于内存分配(包括堆/栈)的问题

原来一直对于内存分配不太清楚,尤其是经常能在面试笔试题里看到关于栈和堆的问题,查资料,总结如下:


Java 内存分配:
 
    首先内存总体分为了4个部分,包括 stack segment(栈), heap segment(堆), code segment(代码区), data segment(数据区);
    其中我们程序中用关键字new出来的东西都是存放在heap segment;
    程序中的局部变量存放在stack segment,这些局部变量是在具体方法执行结束之后,系统自动释放内存资源(而heap segment中的资源需要java垃圾回收机制来处理);
    程序中的方法,是内存中的code segment中的,而且是多个对象共享一个代码空间区域;
    static静态变量,需要放在内存中的data segment中,

下面是一个例子程序的内存分析

class Demo{

private int firistNum;

private int secondNum;

public static int temp  =  3;

public Demo(int firstNum,int secondNum){

this.firstNum = firstNum; 

this.secondNum = secondNum;

}

}

public class Test{

Public static void main(String [] args){

Demo test = new Demo(3,4);     
} }

下面是内存空间分配的过程

内存分析

第二步执行过程

内存分析

这是整个main方法执行过程中的内存空间分配,分析好内存对以后分析逻辑性错误的程序非常重要。


heap和stack的区别

1.heap是堆,stack是栈。2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。3.stack空间有限,heap的空间是很大的自由区。在Java中,若只是声明一个对象,则先在栈内存中为其分配地址空间,若再new一下,实例化它,则在堆内存中为其分配地址。4.举例:数据类型 变量名;这样定义的东西在栈区。如:Object a =null; 只在栈内存中分配空间new 数据类型();或者malloc(长度); 这样定义的东西就在堆区如:Object b =new Object(); 则在堆内存中分配空间。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值