A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

         在课本上看到java中常用的内存区域主要有四个,分别是:栈内存、堆内存、全局数据区(保存static类型的属性)、全局代码区(保存所有的方法);可是,我在看毕老师的视频中,毕老师说 static类型的属性和所有的方法都是保存在方法区。比较凌乱,求解:(:(:(

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 anqi 于 2014-4-17 14:02 编辑

JVM内存分四种:
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源
2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收
3、静态区(datasegment)—存放全局变量,静态变量和字符串常量,不释放
4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域java的不需要我们关注内存,所以内存只是方便我们搞懂很多概念的,只有知道怎么工作的就行

回复 使用道具 举报
anqi 发表于 2014-4-17 09:50
JVM内存分四种:
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体 ...

您的意思是说,方法(不管是静态还是非静态)就是放在全局代码区。而静态成员是另外存放的。也就是说书上说的更靠谱?
回复 使用道具 举报
这其实是同一个问题的不同看法,书上将jvm分配的内存分四种,毕老师将后两种合为一种。
这其实就是他个人的理解。我觉得多参照,自己今后要用到的时候选取一种,然后可以涉及一些其他看法。
个人觉得还是以书上规定的为好!
回复 使用道具 举报
1,栈内存:存放主函数和局部变量以及引用类型变量。
2,堆内存:存放new出来的对象,数组对象。
3,方法区:a:存放静态成员变量和静态方法。
                 b:存放非静态成员变量和非静态方法。
  1. class  Demo1
  2. {
  3.         public static void main(String[] args)
  4.         {       
  5.                 Demo2 a = new Demo2("lisi",29);
  6.                 //Demo2 a:先在栈内存中定义一个Demo2类型的变量a,a暂时指向为null;
  7.                 /*new Demo2("lisi",29):在堆内存中建立一个对象实体,先对name和age进行
  8.                     隐式的初始化,再调用构造函数进行成员变量赋值。最后把这个对象的地址给栈
  9.                         内存中的a。*/
  10.         }
  11. }
  12. class Demo2
  13. {
  14.         String name;
  15.          int age;
  16.         Demo2(String name, int age)
  17.         {
  18.                 this.name = name;
  19.                 this.age = age;
  20.         }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
我看了上面的朋友的回复,发现堆区与栈区是公认存在的。不同的是后面两个或者一个。其实代码区和静态区可以统称为方法区。我总结的如下:
    堆区:
        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);
                        }
                }

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马