A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李菁 中级黑马   /  2012-9-13 15:05  /  1639 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我想知道Java垃圾回收时是否占用内存?虚拟机怎么能保证在内存耗尽之前启动Java的垃圾回收机制啊?

6 个回复

倒序浏览
是这样的 java在语法上会内存自动回收 但是在实际开发中 我们会调用底层c语言中代码 c语言不会自动回收内存 所以我们要手动去关闭资源

1.垃圾收集是一种从无用对象收其所占用的内存,并使回收的内存能被再次使用的机制。
2.无用对象是值它不能被程序中处于活动状态的部分引用(个人理解就是没有引用指向该对象时)。
3.垃圾回收机制(gc)处于低优先级的线程内,当使用内存较少时运行,但不能保证何时运行
4.不可能强制运行垃圾回收线程,但是调用语句System.gc()有可能激活垃圾收集程序。

当然回收的过程中肯定会会占用一些内存的
5.在垃圾回收机制中无法保证对象被垃圾回收的顺序,也无法保证finalize()的方法被调用的顺序。
6.环形引用并不能阻止对象被回收
回复 使用道具 举报
Java的垃圾回收机制用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间,具体如下1、垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身
2、垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。
3、在程序中可以显示的通知jvm进行一次垃圾回收,System.gc()   Runtime.getRuntime().gc()  楼主说的垃圾回收机制是否占用内存,这个肯定会占用,但是这个代价相对于他实现的功能是很微小的,至于“虚拟机怎么能保证在内存耗尽之前启动Java的垃圾回收机制啊?”,上面的前2点说的是jvm垃圾回收机制,它只能说在自己的能力范围之内,尽量的去回收,一般在程序中都够用了,如果程序站的内存很大,还可以调整jvm的堆内存、栈内存大小,实在不够jvm就会抛出内存不足的异常了
回复 使用道具 举报
①当应用程序空闲时,即没有应用线程在运行时,GC(Garbage Collector)会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。
②Java堆内存不足时,GC(Garbage Collector)会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。
由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的.
回复 使用道具 举报
前面说的都不错
我举个例子  Date d1 = new Date();   Date d2 = new Date();  两个对象
如果显示把Date的两个引用  d1 = null ; d2  = null;
JVM就会把这两个对象标记为可回收。 可能会在不久的将来进行垃圾回收。垃圾回收机制主要是释放系统资源,提高资源利用率。
垃圾回收机制也是程序,调用它肯定也要占内存。
回复 使用道具 举报
学习了!!
回复 使用道具 举报
李菁 中级黑马 2012-9-13 23:19:45
7#
问题已解决,谢谢大家了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马