日期:2014-05-20  浏览次数:20852 次

问一个类的声明周期的问题,求解答!
初学Java,对这个静态(类)变量有点绕。如这句话类变量随类的加载而加载(反之亦然)。

我想问的是如果一个方法里面是这样写的,那么当这个方法执行完了后,这个Person类调用完了、静态变量“country”等他们的内存是不是就释放了?


public void show(){
    System.out.println(Person.country)
}

------解决方案--------------------
说白了楼主就是想知道静态变量的生命周期。。。
静态变量随着类的加载而产生,当类被销毁时才被销毁,释放内存。
------解决方案--------------------
当类将要被程序调用时,jvm会完成类的加载;当长时间不用时,jvm会启用gc机制来完成类的销毁。

------解决方案--------------------
一个类里面的静态方法和静态属性,是当程序一开始运行的时候就加载到内存里面,只有当这个程序不再用这里类里面的任何东西的时候就销毁。回答的不好望楼主原谅哈。。。。
------解决方案--------------------
类释不释放。

释不释放,说的是实例化后的对象。
释不释放,说的是数据类型。
java 有那些数据类型?
------解决方案--------------------
我也试试来回答一下, 但程序用的带静态变量的类时,会先把静态变量放到内存中。 不管new多少个类,静态变量只在内存中保留一份,当类不在使用时或程序运行结束时,虚拟机的垃圾回收会释放这些内存吧
------解决方案--------------------
当Person类调用完之后,不在使用了,有垃圾回收来负责回收为这个类创建的内存,当然同时也会释放它的静态变量。

下面是简单介绍JVM类加载初始化
1. 类加载: 把.class文件加载到内存中,根据类中的元素保存到JVM内存的各个区域
2. 连接: 验证字节码文件, 准备将类的静态变量进行分配内存空间、初始化默认值
所有的JVM实现在首次主动调用类和接口的时候才会初始化他们
3. 类的初始化:将类的静态变量赋予正确的初始值
类的主动使用
以下是视为主动使用一个类,其他情况均视为被动使用
1):初学者最为常用的new一个类的实例对象(声明不叫主动使用)
2):对类的静态变量进行读取、赋值操作的。
3):直接调用类的静态方法。
4):反射调用一个类的方法。
5):初始化一个类的子类的时候,父类也相当于被程序主动调用了(如果调用子类的静态变量是从父类继承过来并没有复写的,那么也就相当于只用到了父类的东东,和子类无关,所以这个时候子类不需要进行类初始化)。
6):直接运行一个main函数入口的类。

静态变量的生命周期取决于类的生命周期,当类被加载的时候,静态变量被创建并分配内存空间,当类被卸载时,静态变量被摧毁,并释放所占有的内存

参考:
深入Java虚拟机JVM类加载初始化学习笔记 
Java类的生存周期


------解决方案--------------------
java中的对象都会分配在堆上,当这个对象上无引用指向时gc就会来回收,具体回收时间是不固定的
因为gc回收线程的优先级很低,
------解决方案--------------------
如果问是否会加载,简单回答是,会加载到内存。

1. Java程序执行的时候,会先启动java虚拟机, GC(内存回收)等等初始化工作, 然后类加载器加载程序的class和它import的class文件(lang包是默认导入的)到内存,也就是你的例子里面的System类也会加载到内存。 不知你所说的加载到内存是否是这个。 

2. JVM有4个重要的内存区域
方法区    常量池    堆区    栈区
上面加载的类信息会保存到方法区。 如果你new Person()的话,JVM会根据类的信息给它分配内存(变量,我理解还有方法索引就是能找到这个方法在哪 )。当你调用方法是会在栈区中为方法分配局部变量等内存,当方法运行完这些分配的内存将被收回。 


我也是先查的,然后按照我的理解组织起来来告诉你, 希望对你有所帮助
------解决方案--------------------
静态变量是类一被创建,就会被加载。 即使,没有使用到,也会被加载。
------解决方案--------------------
我说说我知道的东西 静态的变量在类初始化的时候就会先加载,然后等到这个类的实例不再参与程序的其他操作的时候 JVM的 GC就会把这个对象收走。

我记得我看书是这样讲的。
------解决方案--------------------
所有的JVM实现在首次主动调用类和接口的时候才会初始化他们
以下是视为主动使用一个类,其他情况均视为被动使用
1):初学者最为常用的new一个类的实例对象(声明不叫主动使用)
2):对类的静态变量进行读取、赋值操作的。
3):直接调用类的静态方法。
4):反射调用一个类的方法。
5):初始化一个类的子类的时候,父类也相当于被程序主动调用了(如果调用子类的静态变量是从父类继承过来并没有复写的,那么也就相当于只用到了父类的东东,和子类无关,所以这个时候子类不需要进行类初始化)。
6):直接运行一个main函数入口的类。

也就是这些情况类会被初始化
------解决方案--------------------
引用:
明白了,也就是不管你在程序中有没有被其他方法调用了,只要它在程序中存在就会加载到内存中。

对的,可以想象如果每次使用才从硬盘加载到内存的话,速度就太慢啦。程序会像蜗牛爬的
------解决方案--------------------
参考:http://blog.csdn.net/zjclugger/article/details/7887186