黑马程序员技术交流社区
标题:
求解,java中常用的内存区域到底有几个?三个or四个?
[打印本页]
作者:
范国征
时间:
2014-4-17 09:13
标题:
求解,java中常用的内存区域到底有几个?三个or四个?
在课本上看到java中常用的内存区域主要有四个,分别是:栈内存、堆内存、全局数据区(保存static类型的属性)、全局代码区(保存所有的方法);可是,我在看毕老师的视频中,毕老师说 static类型的属性和所有的方法都是保存在方法区。比较凌乱,求解:(:(:(
作者:
anqi
时间:
2014-4-17 09:50
本帖最后由 anqi 于 2014-4-17 14:02 编辑
JVM内存分四种:
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源
2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收
3、静态区(datasegment)—存放全局变量,静态变量和字符串常量,不释放
4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域java的不需要我们关注内存,所以内存只是方便我们搞懂很多概念的,只有知道怎么工作的就行
作者:
范国征
时间:
2014-4-17 10:29
anqi 发表于 2014-4-17 09:50
JVM内存分四种:
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体 ...
您的意思是说,方法(不管是静态还是非静态)就是放在全局代码区。而静态成员是另外存放的。也就是说书上说的更靠谱?
作者:
虎牛龙马
时间:
2014-4-17 11:45
这其实是同一个问题的不同看法,书上将jvm分配的内存分四种,毕老师将后两种合为一种。
这其实就是他个人的理解。我觉得多参照,自己今后要用到的时候选取一种,然后可以涉及一些其他看法。
个人觉得还是以书上规定的为好!
作者:
skill20
时间:
2014-4-17 12:19
1,栈内存:存放主函数和局部变量以及引用类型变量。
2,堆内存:存放new出来的对象,数组对象。
3,方法区:a:存放静态成员变量和静态方法。
b:存放非静态成员变量和非静态方法。
class Demo1
{
public static void main(String[] args)
{
Demo2 a = new Demo2("lisi",29);
//Demo2 a:先在栈内存中定义一个Demo2类型的变量a,a暂时指向为null;
/*new Demo2("lisi",29):在堆内存中建立一个对象实体,先对name和age进行
隐式的初始化,再调用构造函数进行成员变量赋值。最后把这个对象的地址给栈
内存中的a。*/
}
}
class Demo2
{
String name;
int age;
Demo2(String name, int age)
{
this.name = name;
this.age = age;
}
}
复制代码
作者:
创造命运
时间:
2014-4-17 13:36
我看了上面的朋友的回复,发现堆区与栈区是公认存在的。不同的是后面两个或者一个。其实代码区和静态区可以统称为方法区。我总结的如下:
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象本身都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
4.由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.
方法区:
1.方法区跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
public class Test //运行时, jvm把Test的信息都放入方法区
{
public static void main(String[] args) //main方法本身放入方法区。
{
//test1是引用,所以放到栈区里,Student是自定义对象应该放到堆里面
Student test1 = new Student( "Lucy" );
Student test2 = new Student( "Mike" );
test1.printName();
test2.printName();
}
}
public class Student //运行时, jvm把Student的信息都放入方法区
{
private name; //new Student实例后,name引用放入栈区里,name对象放入堆里
public Student(String name)
{
this.name = name;
}
public void printName() //print方法本身放入方法区里。
{
System.out.println(name);
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2