黑马程序员技术交流社区
标题:
请问内存可以分为堆区和栈区,代码区,还有哪个区呢??
[打印本页]
作者:
蒙武辉
时间:
2012-3-26 14:03
标题:
请问内存可以分为堆区和栈区,代码区,还有哪个区呢??
个个区的作用是什么?
作者:
陈建凡
时间:
2012-3-26 14:09
java的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到****作指令)
2.jvm
只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放数据
栈区:
1.每个线程包含一个栈区,栈中只保存原始类型数据和对象和对象引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、****作指令区(存放****作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
这个是转载的,我觉得这个会解释的更好,http://hi.baidu.com/cheng_kp/blog/item/2bdc5a1aba7bacf2af5133ce.html
作者:
孙地豪
时间:
2012-3-26 14:33
可以分为 4 个区,堆内存,栈内存,数据区,代码区。
堆内存: 存放的是对象,如new 出来的东西。
栈内存: 存放局部变量,
数据区: 存放的是静态变量,如String s = "abc",中"abc"其实是放在数据区里面的。
代码区: 存放代码
作者:
anyanyhai
时间:
2012-3-26 14:46
java内存分配中的栈:
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,java就在栈中为这个变量分配内存空间,当该变量退出该作用域的时候,java就会自动释放掉为该变量分配的内存。
java内存分配中的堆:
当用new关键字创建的对象或者数组时候,就会在堆内存中分配内存空间。而此时栈中就可以定义特殊的变量,此变量的取值就是数组或者对象在内存中的首地址,栈中的变量称为数组或对象的引用变量,也就是一个名字。当程序运行到使用new关键字创建的对象或者数组代码块之外时候,数组和对象在堆中的内存空间不会自动释放,而会在以后某个时间被垃圾回收器收走。这就是java比较占内存的原因。而自动垃圾回收器是jvm管理的。
常量池:
常量池是在编译时期被确定并保存在已编译的.class文件的一些数据。包括代码中定义的的各种基本类型(如:int,long)和对象型(如string及数组)的常量值还包含一些文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法的名称和描述符。
虚拟机会为每个被装在的类型保持一个常量池。
堆和栈各自的优缺点:
堆:可以动态的分配内存大小,生存期也不必事先告诉编译器,因为他是在运行时动态分配内存的。但缺点是要在运行时动态分配内存,存取的速度较慢。
栈:存取速度比堆快,仅次于寄存器。栈中的数据可以共享。
例:int a=3;int b=3;
编译器在处理int b=3;时会在栈中创建一个b的引用,之后会在栈中查找是否有3这个值,栈中已经有3这个值,便将b直接指向3.这样就出现a,b同时指向3。这时如果再令a=4;那么编译器会重新搜索栈中是否有这个值,如果没有,则将4存放进来,并令a指向4。如果已经有了,就直接将a指向这个地址。
需要注意的地方:
这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况修改a不会影响到b,他是有编译器完成的,有利于节省内存空间。而一个对象引用变量修改了内部的数据和函数的状态,会影响到另一个对象引用此对象变量。
栈的缺点是:存放在栈中的数据的大小和生存期必须是确定的,缺乏灵活性。
java中的静态域:
存放在对象中用static修饰的静态成员。
作者:
蓝色理想
时间:
2015-10-5 23:01
内存到底是如何分配的?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2