首页 > 编程知识 正文

java主动垃圾回收,java弱引用 垃圾回收

时间:2023-05-05 04:22:22 阅读:163838 作者:550

.关于什么是内存垃圾以及哪些内存符合垃圾标准,如上所述,堆是“运行时”数据区域,是由“new”等指令创建的。 Java堆由Java垃圾回收机制处理,堆动态分配内存大小,垃圾收集器可以自动回收不再使用的内存空间。 也就是说,“内存垃圾”是指在堆中打开的内存空间在未使用的情况下变成了“垃圾”。 C或其他编程语言要求程序员自行声明生成并回收。 否则,其中的资源将被消耗,可能会导致资源浪费和恐慌。 但是,手工回收内存往往是一项复杂而困难的工作。 因为事先判断是否应该回收使用的内存空间是非常困难的! 如果程序无法回收内存空间,并且在程序运行时不再有可分配给系统的内存空间,则程序只能崩溃。 Java和C的优势在于,这部分的“垃圾”会被Java虚拟机(JVM )中的程序发现并自动清除。 程序员自己不需要考虑“delete”。 在Java语言中,提供了一个叫做垃圾回收线程(Garbage CollectionThread )的系统级线程,跟踪分配给各个块的内存区域,在JVM空闲周期时,可以复用各个块的1.1垃圾回收机制垃圾回收线程这是一个低优先级线程,只有在运行Java程序时出现内存空间时才需要进行回收。 垃圾回收系统有判断是否需要回收内存块的判断标准。 垃圾收集器完全自动运行,而不是强制运行。 即使程序员明确地认为应该回收内存,也不能强制运行垃圾回收程序进行垃圾回收。 程序员只能调用' System.gc () )并在“建议”下运行垃圾收集器程序,但不能控制此垃圾收集器何时运行以及是否运行。 但是,虽然垃圾收集器是低优先级线程,但如果系统内存可用空间过低,它可能会意外执行以拯救系统。 1.2符合“垃圾”标准的有哪些? 想知道JVM垃圾回收的话,必须知道JVM垃圾回收的标准。 垃圾回收器的“垃圾”条件:当程序中的其他程序不再引用对象时,该对象的内存空间不再使用。 例如,方法执行完成后,在该方法中声明的对象将超出声明周期,在该点被收集为垃圾,并且只有在再次调用该方法时才会重新创建。 例如,您可以将对象的引用变量初始化为null值,也可以通过隐含垃圾收集器来收集对象。 例如,1.3 finalize ) )在对象的垃圾回收之前调用垃圾收集器以跟踪每个对象,并收集不可访问对象占用的内存空间。 此外,每次进行垃圾回收时,垃圾收集器都会调用finalize ) )方法。 在Java语言中,程序员可以向任何对象添加finalize ()方法,但调用方法后的执行结果无法预测,因此不能过度依赖于方法对系统资源的重用和重用。 对于特定对象,Java虚拟机最多只调用一次finalize方法。 我用这个程序展示一下。 ……公共void function (() {OBJ obj=new OBJ ) ); ……}…………OBJ obj=new OBJ (); Obj=null; ……在命令行中输入以下命令: 此时,将JVM可以使用的最大内存设置为' 1k ',在内存已满之前,JVM首先要考虑publicclassfinalizetest { publicstaticvoidmain [ string ] args } fublicsssinalizetest byte bs[]=new byte[1450000]; }public void loading () {test t=new test ); t.callme (; } classtest { protectedvoidfinalize () system.out.println ) (callfinalize ); }public void callme () (system.out.println ) ' callme ); }}java -Xmx1k finalizeTest内存回收,并回收了丢失活动的“test”对象,在回收之前调用了“finalize ()”。

2. JVM垃圾收集相关知识JVM使用的是分代垃圾收集方式。 主要是因为程序运行过程中具有以下特点。 大多数对象在创建后立即不再使用对象。 大多数对象很少参考新创建的对象。 因此,Java将对象分为“年轻”对象和“老”对象,JVM将内存堆(Heap )分为“年轻”区域和“老”区域两个区域,Java将这两个区域分别划分为“zzdhb” 在“zzdhb层代”区域中,大多数新创建的对象都存储在此区域中。 因为这个区域一般很小,垃圾回收频率高,“zzdhb一代”采用的再利用效率也非常高。 “老生代”区域存放着“zzdhb代”中长期生存的对象,这些对象将被转移到“老生代”区域。 该地区一般较大,增长速度相对于“zzdhb世代”稍慢,“老生世代”的垃圾回收执行频率也相当低。 由于JVM在垃圾回收过程中会消耗一定的系统资源,因此在启动JVM时添加相关参数以控制“zzdhb层代”区域的大小和调整垃圾回收频率可能非常有用。 使系统资源得到更合理的利用。 “zzdhb层代”区域配置参数为“-Xmn”,该参数允许指定“zzdhb层代”区域的大小。 让我举例说明一下

:我们就用系统自带的程序作为例子,在命令行上键入如下指令:上面加入了一个新的参数"XX:+PrintGCDetails",这个参数能够打印出GC 的详细信息。屏幕输出如下(节选):CD C:/java/demo/jfc/SwingSet2[回车]C:/java/demo/jfc/SwingSet2>java -jar -verbose:gc-Xmn4m XX:+PrintGCDetails SwingSet2.jar[回车]我们需要解释一下输出的详细内容的意思,拿第一行输出来说:"DefNew: 3469K->84K(3712K), 0.0007778 secs"是指"zzdhb代"的垃圾回收情况,这里的意思是从占用3469K 内存空间变为84K 内存空间,用时0.0007778秒。"23035K->19679K(28728K), 0.0009191 secs"是指总体GC 的回收情况,整体堆空间占用从23035K 降低到19679K 的水平,用时0.0009191秒。那么,这时候我们在将"zzdhb代"的内存设为8M,并把堆的最大可控值设定为32M,再去执行,键入如下指令:得到的结果如下(节选):这个结果说明:[GC [DefNew: 3469K->84K(3712K), 0.0007778 secs]23035K->19679K(28728K), 0.0009191 secs][GC [DefNew: 3284K->171K(3712K), 0.0007283 secs]22878K->19766K(28728K), 0.0008669 secs][GC [DefNew: 3476K->260K(3712K), 0.0008504 secs]23071K->19855K(28728K), 0.0009862 secs][GC [DefNew: 3502K->87K(3712K), 0.0009267 secs]23096K->19682K(28728K), 0.0010610 secs]java -jar -verbose:gc -Xmn8m -Xmx32mXX:+PrintGCDetails SwingSet2.jar[回车][GC [DefNew: 6633K->6633K(7424K), 0.0000684 secs][Tenured: 18740K->18820K(24576K), 0.0636505 secs]25374K->18820K(32000K), 0.0639274 secs][GC [DefNew: 6646K->6646K(7424K), 0.0002581 secs][Tenured: 18820K->18884K(24576K), 0.0651957 secs]25467K->18884K(32000K), 0.0658804 secs][GC [DefNew: 6611K->6611K(7424K), 0.0000668 secs][Tenured: 18884K->18505K(24576K), 0.0931406 secs]25496K->18505K(32000K), 0.0934295 secs]"[DefNew: 6633K->6633K(7424K), 0.0000684 secs]"是指"zzdhb代"的垃圾回收情况,这里的意思是从占用6633K 内存空间变为6633K 内存空间,用时0. 0000684秒。"25374K->18820K(32000K), 0.0639274 secs"是指总体GC 的回收情况,整体堆空间占用从25374K 降低到18820K 的水平,用时0. 0639274秒。"[Tenured: 18740K->18820K(24576K), 0.0636505 secs]"是指"老生代"GC 的回收情况,整体堆空间占用从18740K 降低到18820K 的水平,用时0.0009012秒。通过这些参数的调整我们可以看到在处理垃圾收集问题时,从垃圾回收的频率是时间方面的变化,我们可以根据不同程序的不同情况予以调整。最后有必要提一下GC 的相关参数:-XX:+PrintGCDetails 显示GC 的详细信息-XX:+PrintGCApplicationConcurrentTime 打印应用执行的时间-XX:+PrintGCApplicationStoppedTime 打印应用被暂停的时间注:":"后的"+"号表示开启此选项,如果是"-"号那么表示关闭此选项。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。