欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java内存分配

程序员文章站 2022-03-06 17:25:51
...

原文地址: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/