在java中new出来的事物都放在堆内存中。
引用类型相当于指针。基础类型在内存分配的时候占1块内存,引用类型在内存分配的时候占2块内存。
栈、堆、常量池、代码区、静态区
1,基础数据类型直接在栈空间stack分配,方法的形参,直接在栈空间分配,当方法调用完成后从栈空间回收
2 引用数据类型,需要用new来创建,既唉栈空间分配一个地址空间,又在堆空间heap分配对象的类变量。
3.方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后,从栈空间回收。
4.局部变量new出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。
5 方法电泳时传入的基本数据类型(literal)参数,现在栈空间分配,在方法调用完成后从栈空间clear。
6.字符串常量在data segment区域分配,static在datasegment区域分配,
7.This在堆空间分配
8.数组既在栈空间非配数组名称,又在堆空间分配数组实际的大小。
内存分析:
局部变量永远在栈里;new出来的东西以及C语言中的成员方法所占内存永远在堆里;静态的东西和(字符串常量)永远在数据区;剩下的代码在指定的代码区。
例如:成员变量,当你new出来一个类的时候才会去将类中的成员变量调出来,所以成员变量应该放在堆里。
实例精讲:
内存总体分为了4个部分,包括 stack segment(栈内存) 、heap segment(堆内存)、codesegment(代码区) 、data segment(数据区)。
1、 其中我们程序中用关键字new出来的东西都是存放在heapsegment(堆内存);
2、 程序中的局部变量存放在stack segment(栈内存),这些局部变量是在具体方法执行结束之后,系统自动释放内存资源(而heap segment中的资源需要java垃圾回收机制来处理);方法调用完后,为方法分配的所有的局部变量自动消失。
3、 程序中的方法,是内存中的code segment(代码区)中的,而且是多个对象 共享一个代码空间区域;
4、 static静态变量,需要放在内存中的data segment中,
下面是一个例子程序的内存分析
下面是内存空间分配的过程
第二步执行过程
这是整个main方法执行过程中的内存空间分配,