黑马程序员技术交流社区
标题:
请问class是存储在哪个内存当中的?
[打印本页]
作者:
郭嵘
时间:
2012-5-31 14:19
标题:
请问class是存储在哪个内存当中的?
本帖最后由 郭嵘 于 2012-5-31 14:43 编辑
各位学长学姐,老师,你们好 我是一个刚开始学习java的新手,刚看视频,遇到一个小问题,像定义一个变量,会存放在栈内存中,定义一个对象会储存在堆内存中,定义一个static,会存储在共享区,那么定义一个类,此类是存储在内存中的哪里呢,或者是类只是用来描述对象的,根本不进内存呢?
作者:
刘伯阳
时间:
2012-5-31 14:42
本帖最后由 刘伯阳 于 2012-5-31 15:19 编辑
好吧,这个问题我也没有查过。根据我的理解,一个类当它没有被实例化的时候(没有new出来的时候),它没有在内存中分配地址空间。我估计在内存中应该是没有存放的。存在硬盘上面了吧。
作者:
胡团乐
时间:
2012-5-31 14:49
应该是存放在硬盘中的,当你new对象的时候才会加载该类,然后根据类的情况(函数等等)在内存里分配地址 没new对象时是不会在内存里分配地址的
作者:
王章亚
时间:
2012-5-31 15:06
还真没想过这个问题,小伙子有前途,我也好好想想,应该是硬盘里面吧!
作者:
李天甲
时间:
2012-5-31 15:58
本帖最后由 李天甲 于 2012-5-31 16:00 编辑
刚才查了一下,有一个东西叫做“类加载器”当需要这个类的时候类加载器会加载某一个类。这个一般是虚拟机来负责的。JVM运行Java程序的时候,它会加载对应的class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中。
当然这个加载器是什么,我也不清楚,可以参考一篇文章“深入探讨Java 类加载器” (http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 呵呵,好像发帖不能用超级链接啊 ) 上面的链接是IBM develop上的一个说明。咱们一起简单了解一下吧。
作者:
凡延海
时间:
2012-5-31 16:05
一个类经过编译后编程了class文件,当运行程序的时候,系统会加载带有main函数的文件,在运行的时候如果还需要其它的文件则在从硬盘上加载到内存中,
作者:
郑文博
时间:
2012-5-31 16:26
本帖最后由 郑文博 于 2012-5-31 16:30 编辑
我想先给你的话挑个瑕疵。。。 变量不是全都存放在栈内存的。局部变量是作用于函数或语句中的,他存储于栈内存。而成员变量是作用于类中的,他是存储在堆内存的。从这一点一般就能确定类是在堆内存的。暂时不知道特殊情况,我也反反复复看了第五天的视频好多次才有所领悟。建议楼主也再仔细看看面向对象这部分视频,问题很多的。共同努力吧{:soso_e121:}
作者:
张文强
时间:
2012-5-31 17:12
首先要说下java中内存分配的常识
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域 :存放静态成员(static定义的)
5. 常量池 :存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间
类中包含基本数据类型、变量数据、静态成员、基本类型常量.....而这些元素是类中的某一部分 你能说类放在内存中的具体哪个地方吗,
而我们运行某个程序(java编辑器)时是要加载到内存上的,我们定义一个类说明我们正在通过编辑器操作操作它,它当然就在内存当中了
当我们编写完某个程序时通过javac命令编辑生成.class文件。当我们不使用时它是保存在硬盘上的。
再想使用它时就要通过java中有个叫类加载器的东西把它加载到内存当中使用
有点啰嗦,应该讲清楚了吧{:soso_e113:}
作者:
于清云
时间:
2012-5-31 20:58
当我们用编辑器编写代码,定义一个类时候,由于编辑器本身是个软件在运行,所以定义一个类的时候,此时这个类无可厚非的在内存里呆着,等编写定义完了,不用的时候,因为你定义的类存在一个文件里,所以就会随着文件安静的在硬盘里呆着。等到你再次用到这个文件中的类时候,类加载器就会来加载 Java 类到 Java 虚拟机中。这时候原先定义的类就又跑到内存里了,一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2