static 占用内存疑问??

bxdg42578670 2008-05-13 05:13:17







说法一: static 在类编译的时候 , 所有带static的属性与方法 都被加栽了!~~

加栽了 肯定要占用内存...





疑问一: 哇!~ 那要那样的话!~, 电脑上所有的class文件 带static属性的都被加栽中, 不会释放吗?.

那得浪费多少内存啊!?. 对此始终不解!!! 而且static听说不会被垃圾回收!不知道是真是假!

是否所有带static属性的class文件都在吃着我电脑的内存呢?.. 即使我没有执行它!









说法二: static 是放在栈中! ,一般变量会通过拷贝方式传值,而static应该是传引用.内存中效率是要高许多的,他又只产生一次,应该说他是即省时间又省空间









疑问2: 这就更迷糊了!~ static的跟栈还有着关联吗?. 对static更是不解了!


补充: 能否再补充一下 加载 与 执行 的区别吗?..








诚 心 请 教 ! 十 分 感 谢!
...全文
157 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsxfhao 2008-05-13
  • 打赏
  • 举报
回复
可以肯定的是,编译时是不会加载任何东西的。
至于static,我只知道它跟实例是不搭界的。只有在第一次访问的时候系统才会分配空间给static。
skyqiang 2008-05-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 anqini 的回复:]
说法1:编译跟加载没联系!只有加载的时候才分配static的空间!编译是编译器的工作,分配是jvm的工作!

说法2:static应该在方法区,也就是类信息区~跟栈,堆不一样,栈是这个线程独有的,堆和方法区是一个应用的所有线程共享的!

正准备使用这个类之前才加载!
比如:new A(); Class.forName("className")等等!

个人理解!
[/Quote]
lovingprince 2008-05-13
  • 打赏
  • 举报
回复
static编译是不会加载的,而是运行期加载。
bloodrate 2008-05-13
  • 打赏
  • 举报
回复
.......
一般来说,static占用的内存与实例化大量对象占用的内存相比是杯水车薪,只有对象在大量实例的时候,内存的消耗才成为性能的干扰因素,所以每个类加载的内存消耗是可以忽略的。
一般来说虚拟机内存分为两个部分,方法区和堆,加载的类和静态变量存在方法区,实例化的对象存在堆中,一般的内存消耗都是指堆内存不足,从未见过有方法区内存不足的。
anqini 2008-05-13
  • 打赏
  • 举报
回复
说法1:编译跟加载没联系!只有加载的时候才分配static的空间!编译是编译器的工作,分配是jvm的工作!

说法2:static应该在方法区,也就是类信息区~跟栈,堆不一样,栈是这个线程独有的,堆和方法区是一个应用的所有线程共享的!

正准备使用这个类之前才加载!
比如:new A(); Class.forName("className")等等!

个人理解!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧