Java内存分配
原文地址:http://www.cnblogs.com/transmuse/archive/2010/11/18/1881282.html
1. java中内存的分配
java程序在运行时,内存结构分为:方法区(method),栈内存(stack),堆内存(heap),本地方法栈(java中的jni调用)等。
jvm为每一个运行的线程分配一个堆栈(方法栈),堆栈以帧为单位来保存线程的运行的状态,java中,我们将当前正在运行的方法称为当前方法,当java激活(执行)一个方法时,就会向堆栈中压入一个帧,堆栈中的这一帧就代表这个方法在运行时jvm为它分配的内存,这一帧叫做当前帧,帧里可以存放方法的参数,中间结果和局部变量等。当当前方法执行完时,当前帧也会出栈,即该内存区域被释放。方法栈中只会存放基本类型数据和对象的引用。
基础数据类型直接在栈空间分配,方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 。方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收。局部变量new出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。方法调用时传入的literal参数,先在栈空间分配,在方法调用完成后从栈空间分配。字符串常量在DATA区域分配,this在堆空间分配。数组既在栈空间分配数组名称,又在堆空间分配数组实际的大小!
。。。。。
自己一些简略的摘抄,总结:
①final关键字修饰方法或者变量,可以减少寻址时间,提高效率,当然它修饰之后变量值不能改变(如果是对象,表示地址不能改变)!
②finalize 方法在Object中,所有类都继承了,子类可以重载,GC回收的时候会先调用该方法执行里面的清理任务,然后再清除对象。
③
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出 str1 和 str2 是指向同一个对象的。
String str1 = new String ("abc");
String str2 = new String ("abc");
System.out.println(str1==str2); // false
④废话不想讲了.入主题:
先了解具体的概念:
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量
另见:http://liu1227787871.blog.163.com/blog/static/205363197201263103320466/
上一篇: 我发现了快手即将上线的变现工具 带货主播的流量布局要重新洗牌了
下一篇: 12、内部类
推荐阅读