说法一:   static 在类编译的时候   , 所有带static的属性与方法 都被加栽了!~~           加栽了  肯定要占用内存...


疑问一:   哇!~ 那要那样的话!~, 电脑上所有的class文件 带static属性的都被加栽中, 不会释放吗?.          那得浪费多少内存啊!?. 对此始终不解!!! 而且static听说不会被垃圾回收!不知道是真是假!        是否所有带static属性的class文件都在吃着我电脑的内存呢?.. 即使我没有执行它!

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

疑问2: 这就更迷糊了!~ static的跟栈还有着关联吗?.  对static更是不解了!
补充:  能否再补充一下 加载  与  执行   的区别吗?..    


诚 心 请 教 !  十 分 感 谢!

解决方案 »

  1.   

    说法1:编译跟加载没联系!只有加载的时候才分配static的空间!编译是编译器的工作,分配是jvm的工作!说法2:static应该在方法区,也就是类信息区~跟栈,堆不一样,栈是这个线程独有的,堆和方法区是一个应用的所有线程共享的!正准备使用这个类之前才加载!
    比如:new A(); Class.forName("className")等等!个人理解!
      

  2.   

    .......
    一般来说,static占用的内存与实例化大量对象占用的内存相比是杯水车薪,只有对象在大量实例的时候,内存的消耗才成为性能的干扰因素,所以每个类加载的内存消耗是可以忽略的。
    一般来说虚拟机内存分为两个部分,方法区和堆,加载的类和静态变量存在方法区,实例化的对象存在堆中,一般的内存消耗都是指堆内存不足,从未见过有方法区内存不足的。
      

  3.   

    static编译是不会加载的,而是运行期加载。
      

  4.   

    可以肯定的是,编译时是不会加载任何东西的。
    至于static,我只知道它跟实例是不搭界的。只有在第一次访问的时候系统才会分配空间给static。