static类/变量会不会被GC回收?

wjvonline 2006-04-16 05:02:10
调用System.gc(),没测试出来,大家来讨论下~
...全文
4462 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
做鸡真好吃 2006-05-10
  • 打赏
  • 举报
回复
??
netsummer123 2006-04-17
  • 打赏
  • 举报
回复
应该不会把
netsummer123 2006-04-17
  • 打赏
  • 举报
回复
好像GC只回收堆内存里的对象把
foxty 2006-04-17
  • 打赏
  • 举报
回复
纠正一些错误的说法。

static变量同样是再heap上分配空间的。也会北回收,当这个类不需要再用到时,虚拟机就会回收这个类再heap中分配的控件,同时他的static变量肯定也会被回收(这个static变量唯一被引用)。
treeroot 2006-04-17
  • 打赏
  • 举报
回复
stack里对象需要回收吗? 方法返回什么都没有了
况且stack里面有对象吗? (stack分配对象需要在编译时知道对象的大小)

treeroot 2006-04-17
  • 打赏
  • 举报
回复
对象的回收和是否static没有什么关系!
对象都是一样的,只要没有对它的引用,就可以被回收(但是不一定被回收).

static只是说这个对象属于类实例变量,引用是一直存在,被引用的对象当然可以改变.
只要其他地方都没有引用它,就可以被回收.

zorro09 2006-04-17
  • 打赏
  • 举报
回复
stack 里应该是不会被回收的, heap是会的。
UnAgain 2006-04-16
  • 打赏
  • 举报
回复 2
我的观点:

1)静态变量本身不会被回收
2)静态变量所引用的对象是可以回收的。

第一点大家应该没有疑问,下面我证明第2点:

看下面的例子及注释。自己可以运行试一下, 注意加上-verbose:gc参数

java -verbose:gc TestStaticGc

// TestStaticGc.java
public class TestStaticGc {
// ia是一个静态变量,在这里它作为一个int数组的引用。
static int[] ia = new int[1024 * 1024];

public static void main(String[] args) {
int i = 0;
// 为了清楚,我用了6次循环,每次都调用System.gc();
// 在第3次循环时,我把ia的引用设为null。
    // 如果ia指向的对象能被回收的话,应该有明显的内存减少现象。
do {
if (3 == i++) {
ia = null;
System.out.println("release");
}
System.gc();
} while (i<6);
}
}

现在看结果:
---------- java ----------
// 前两次是每个应用初始化之后都要做的。
[GC 328K->162K(1984K), 0.0043279 secs]
[Full GC 162K->162K(1984K), 0.1501831 secs]
// 下面是调用System.gc()的结果
[Full GC 4267K->4258K(6084K), 0.0234695 secs]  // i = 0
[Full GC 4268K->4258K(7676K), 0.0235161 secs]  // i = 1
[Full GC 4258K->4257K(7676K), 0.0299952 secs]  // i = 2
release // 静态变量设为null
// 看,明显的内存变化。
[Full GC 4266K->161K(7676K), 0.0234256 secs]   // i = 3
[Full GC 161K->161K(7676K), 0.0233586 secs]   // i = 4
[Full GC 161K->161K(7108K), 0.0238793 secs]   // i = 5

结论:
我的观点正确。

结果:
楼主给分吧
powerman_lyj 2006-04-16
  • 打赏
  • 举报
回复
上面有字写错了:

静态变量是依附于创建他的类的,只有引用他类,和创建他的类都没有被其他类引用时才会被垃圾处理器回收
powerman_lyj 2006-04-16
  • 打赏
  • 举报
回复
静态变量是依附于创建他的类的,只有应用他类,和创建他的类都没有被其他类应用时才会被垃圾处理器回收
xujianhua815926 2006-04-16
  • 打赏
  • 举报
回复
楼上的 pane 是对象的引用,分配在栈中.
回收的一般是通过new产生在堆上的对象.
Dan1980 2006-04-16
  • 打赏
  • 举报
回复
晕,对象都是在heap上的!
你不把对象的引用设为null,GC永远不会回收。
yes1983 2006-04-16
  • 打赏
  • 举报
回复
不会,gc只回收heap里的对象
kingofworl 2006-04-16
  • 打赏
  • 举报
回复
不会
睡在床板下_ 2006-04-16
  • 打赏
  • 举报
回复
收回 什么??
static 又不是在 heap上分配的
ld_thinking 2006-04-16
  • 打赏
  • 举报
回复
不存在收不收回。。。
UnAgain 2006-04-16
  • 打赏
  • 举报
回复
静态变量本身不会被回收,但是它所引用的对象应该是可以回收的。
wjvonline 2006-04-16
  • 打赏
  • 举报
回复
恩,楼上的诸位说的都是,我仔细想了想,应该不会被回收,他不是被分配在heap里,生命周期应该是在JVM结束时
UnAgain 2006-04-16
  • 打赏
  • 举报
回复
声明
static Vector pane = new Vector();

然后
pane = null;

如果没有其它引用的话,原来pane指向的对象实例就会被回收。据我所知没有办法测试。因为,只要别的地方也存在该Vector对象的引用,那么就不符合回收标准;如果都没引用了,你也无法判断该Vector对象是不是真的从内存里回收了。所以,就相信JVM的GC吧。
interpb 2006-04-16
  • 打赏
  • 举报
回复
全局变量始终会有一个Class 对象的句柄指向它

除非这个Class对象要被回收了

否则静态变量是不会被GC掉

加载更多回复(5)
该课程由付强老师主讲,系统的、全面的、具体的讲解了java入门的知识。可以使初级的学员入门。Java入门Java的历史、Java的版本、Java的优势、软件行业前景Java开发环境搭建、编写Java入门练习虚拟机的运行机制、Java的平台无关性、虚拟机垃圾回收机制基础语法关键字、标识符、Java数据型分、基础数据型、取值范围变量、常量、三种注释、生成doc文档、运算符、表达式if语句、switch语句、嵌套判断for语句、while语句、do-while语句、嵌套循环和对象面向过程和面向对象的区别的构成、访问修饰符、对象的内存分配this关键字、按值传递与按引用传递、对象的初始化顺序高级特性的继承、父子的初始化顺序、单继承性方法的覆盖、重载、super关键字、多态、instanceof关键字、强制型转换、static关键字、final关键字数组和枚举一维数组的应用及内存分配多维数组的应用及内存分配数组的复制、数组的按引用传递排序算法:冒泡、直接选择、插入选择、希尔、快速、归并、堆排序Arrays工具的应用枚举型的应用常见的使用Object的底层及应用、ObjectsString的底层及应用、正则表达式StringBuffer和StringBuilder的底层及应用Math的应用、包装的应用日期的应用:Date、DateFormat、Calendar、LocalDateTime、Instant、LocalDate、MonthDay、ZonedDateTime、YearMonth、新旧日期转换BigInteger和BingDecimal、DecimalFormatSystem、Scanner抽象和接口抽象的规则及应用接口的规则及应用默认方法、静态方法、函数式接口、Lambda表达式异常异常的定义异常的处理:抓(try-catch-finally)、抛(throws)异常的分、自定义异常的应用、throw关键字集合框架集合框架结构:接口、实现Collection接口的方法、Set接口的方法、List接口的方法、Map接口的方法Array、Linked、Hash、Tree底层实现原理泛型的作用、Collections工具、历史集合I/O流Path的原理及应用、Files的原理及应用文件字节流FileInputStream的原理及应用对象、缓冲流、数据流的原理及应用字符流的原理及应用多线程进程与线程的概念、查看线程对象Java内存模型线程的创建与启动:扩展Thread、实现Runnable接口、实现Callable接口、线程池线程状态的转换:新建、就绪、运行、阻塞、死亡线程的调度:sleep、yield、join、interrupt、wait后台线程、定时任务线程的并发与同步、同步锁、同步块、线程安全的Lock接口、CAS、volatile修饰符内部成员内部、本地内部的应用匿名内部的原理及引用、Lambda表达式设计模式基础设计模式概念、框架概念7大设计原则:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则、里氏替换原则、合成复用原则单例模式、工厂模式、模板模式、代理模式、装饰模式、适配器模式、外观模式、策略模式、观察者模式、命令模式、备忘录模式、观察者模式反射反射包Class的使用反射获取属性、方法、构造器通过反射创建对象/通过反射调用方法反射的应用

62,614

社区成员

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

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