java垃圾回收器的问题
发布网友
发布时间:2024-09-29 15:35
我来回答
共3个回答
热心网友
时间:2024-10-03 06:40
《java编程思想》上有句话87页“如果程序执行结束,并且垃圾回收器一直没有释放你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统”
我话我的理解是:程序写得不好,有内存泄露现象,被标为使用状态的废弃对象,垃圾回收器无法将其回收。这部分对象占用的内存在程序退出时,也会被完全释放(程序运行时则不能释放,java程序的变量是在java虚拟机的堆上分配的)。
89页这句,没看到上文,有些不好解释。不过System.gc(),不等于程序结束时才调用。也有可能是虚拟机在运行期间根据一定的算法调用,也可能是你在代码中自行调用。但这话中“最终也能找出错误的Book对象”,没想明白,也许得要看上下文后才能分析。
热心网友
时间:2024-10-03 06:41
System.gc()不是强制解除程序或线程,而是同时JVM强制启动垃圾回收器,而且这只是通知,垃圾回收器还不一定执行,条件很苛刻。。。并且,真正在下一次垃圾收集的过程中,内存回收才开始追问我一直感觉上面两句话有矛盾,程序结束的标志是什么?我用的是myeclipse,点击运行,运行结果出来后程序不就运行结束了吗,既然程序结束了,按照第一句话那么存储资源就交还给了操作系统,资源也就回收了,那第二句话就说不通了,如果资源交给了操作系统回收了,那么执行一次操作系统回收一次,不管怎么重复执行存储空间也不会满,也就不会引起GC的执行了
何解??
追答你理解错误了,第一句中“则随着程序的退出,那些资源也会全部交还给操作系统”,这个里面说的资源指的是垃圾回收器本身占用的资源,这句话的意思就是说垃圾回收器没有被使用,程序结束时,垃圾回收器占用的资源被交还给操作系统,因为没使用占资源是种浪费,而且这个资源也不仅是内存,还有CPU等其他东西。。。。。
而第二句里面的解读是:垃圾回收器回收的是JVM中堆,和方法区的内存,这部分内存在你线程和程序结束时是不会自动还给系统的,这就是为什么C++编程对内存的操作必须有申请有释放,JVM垃圾回收器存在的意义。。。。。
还有程序结束的标记是该程序的线程全部执行完毕,并不是运行结果出来就代表着程序结束,后台还有些线程需要处理,这个你可以通过finalize()来试验看看。。。。。。
热心网友
时间:2024-10-03 06:41
03阿伟大碗
Java 的垃圾回收机制机制如何优化?
Java 的垃圾回收机制可以通过以下方式进行优化:1. 调整堆大小:通过设置 -Xmx 和 -Xms 参数来调整堆的大小,以便更好地适应应用程序的需求。2. 选择合适的垃圾回收器:Java 提供了多种垃圾回收器,如串行收集器、并行收集器、并发标记清除收集器等。根据应用程序的特点和需求选择合适的垃圾回收器。3....
求教一个java关于垃圾回收的问题
(1) GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。(2) 对于GC来说,当程序员创建...
Java 垃圾回收的问题,请教
java的回收机制有时候会出现当你内存可用空间多的时候反而感觉卡,而内存少的时候反而感觉不卡了,这就是垃圾回收的时候要耗费很大的系统资源,当他启动后可用内存是多了,但是资源还没放开。而可用资源少的时候,就是java认为他现在这点空间已经够他用了,他就不回收了,而且事实上你的程序的确也不需要...
java垃圾回收器的问题
我话我的理解是:程序写得不好,有内存泄露现象,被标为使用状态的废弃对象,垃圾回收器无法将其回收。这部分对象占用的内存在程序退出时,也会被完全释放(程序运行时则不能释放,java程序的变量是在java虚拟机的堆上分配的)。89页这句,没看到上文,有些不好解释。不过System.gc(),不等于程序结束...
java垃圾回收疑问
第二种测试没有输出结果是因为生成的book对象的生命周期没有结束所以就没有调用了finalize方法。楼主可以试着把第二种测试改成下面那样,让book的生命周期结束,这样它就被回收了。主要问题就在生命周期上。public class Test { public static void main(String arg[]) { boolean flag = true;if (...
问一个java垃圾回收的问题
不存在。java的内存管理你可以结合有向图来理解,java中一个对象适合垃圾回收的条件是该对象存在内存中,但是没有任何箭头指向它,也就是该对象已经不可达。一个不可达的对象是没有办法再让他成为可达对象的。这个就像一堆气球,有的气球系了绳子线,规定了你只能触摸绳子不能触摸气球,如果气球的绳子被...
JVM - 垃圾回收
的垃圾,不回收的话会一直占用内存,对于程序的性能,内存是有一定影响的;在 C++ 中,开发人员是自己进行垃圾回收的,但是在 Java 中,JVM 里面存在多种垃圾回收器以及多种垃圾回收算法,底层的垃圾回收一般情况下不需要开发人员关心,但是在某些特定的场景下,需要开发人员掌握 JVM 垃圾回收机制,更好的解决一些程序问题;...
Java的垃圾回收
准确的说垃圾回收是一种资源释放策略,或者叫机制。并不是完全采用一种回收算法。关于JVM中对象的生命周期,参考JVM规范。新生代,原生代,老年代。。。影子对象,可捕获的影子对象。。。关于对象池,Java中的“引用”的真正含义,望自琢磨。
JAVA垃圾回收的工作原理是什么?
所谓jvm垃圾回收机制其实就是相较于于c、c++语言的优势之一是自带垃圾回收器,垃圾回收是指不定时去堆内存中清理不可达对象。垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,程序员唯一能做的就是通过调用System.gc 方法来建议执行垃圾收集器。
java垃圾回收问题?
JAVA的垃圾回收是自动进行的,非要手动的话,System.gc()/Runtime.gc();在多线程的情况下,此类可能不只产生1个实例;使用不同的类加载器加载就可以得到多个A的实例;如果你的本意是想使类A只能有一个实例,那么请用Singleton模式改写此类,你这个写的看着有点难受.计数器递减没有什么不可以的,不知道你...