一、System.gc()调用

  System.gc()用于调用垃圾收集器,在调用时,垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。我们习惯了从现实世界的经验中获得的“条件适用”。一切都附有免责声明!

  JVM实现者可以通过System.gc()调用来决定JVM的行为。一般来说,我们在编写Java代码并将其留给JVM时,不要考虑内存管理。在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()。以下是调用gc有所作为的另一个例子。

二、MappedByteBuffer与System.gc()

MappedByteBuffer用于需要最佳IO性能的地方。MappedByteBuffer提供到底层文件的直接内存映射。

API Javadoc说,

内存映射文件的许多细节固有地依赖于底层操作系统,因此是未指定的。当请求的区域未完全包含在该通道的文件中时,此方法的行为是未指定的。对该程序或另一个的底层文件的内容或大小进行的更改是否被传播到缓冲区是未指定的。没有指定将缓冲区的更改传播到文件的速率。

几乎所有的东西都是未指定的,并留给底层操作系统。我们来看下面的代码:

package com.javapapers.java;import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;public class MappedFileGc {public static void main(String[] args) throws IOException {File tempFile = File.createTempFile("Temp", null);tempFile.deleteOnExit();RandomAccessFile raTempFile = new RandomAccessFile(tempFile, "rw");FileChannel fChannel = raTempFile.getChannel();MappedByteBuffer mappedBuffer = fChannel.map(FileChannel.MapMode.READ_WRITE, 0, 512);fChannel.close();raTempFile.close();mappedBuffer = null;System.gc();if (tempFile.delete())System.out.println("Successfully deleted: " + tempFile);elseSystem.out.println("Unable to delete: " + tempFile);}
}

  在上面的代码中,行号24 System.gc()被注释。当我现在运行这个程序,总是得到“ Unable to delete: …  ”。现在可以取消注释System.gc()并重新运行它多次以了解行为。现在我们得到“Successfully deleted: …”。大部分时间,我测试的与ByteBuffer相同,垃圾收集立即发生。

相似的,因为MappedByteBuffer依赖于操作系统,垃圾收集器不能立即回收。但是当我们调用System.gc()垃圾收集器释放句柄,我们可以删除该文件。推荐一下,“在使用MappedByteBuffer的同时,如果我们正在使用内存敏感程序,那么最好调用System.gc()”。请注意,此行为依赖于JVM。

 

System.gc()调用 - 适用的场景相关推荐

  1. jstat的小伙伴:找出system.gc的调用的小工具

    场景分析 现场环境中,造成gc频繁的可能性之一就是通过system.gc主动调用了gc.这种情况出现在开发人员业务代码,或者是jdk自身的代码中(例如nio).我们可以通过jstat -gccause ...

  2. JVM学习笔记之-垃圾回收相关概念 System.gc()的理解 内存溢出与内存泄漏 STW 垃圾回收的并行与并发 安全点与安全区域 再谈引用:强引用 软引用 弱引用 虚引用 终结器引用

    System.gc()的理解 在默认情况下,通过System.gc()或者Runtime. getRuntime ( ).gc ()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试 ...

  3. gc System.gc() fullGC

    当 System.gc() 或 Runtime.getRuntime().gc()等API被调用时,将触发完整的GC事件.在GC完成之前,整个JVM将冻结(即正在运行的所有服务将被暂停),通常完整的G ...

  4. java的System.gc()的理解

    目录 什么是System.gc() 实例1 实例2 什么是System.gc() 1.在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发F ...

  5. 一个利用System.gc和finalize研究Java垃圾回收机制的练习

    源代码: package basic;public class finalizeTest {private String name;public void finalize(){System.out. ...

  6. System.gc()的理解

    一.在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存. 二.然 ...

  7. 对System.gc() 和STW的理解

    System.gc() 的理解 在默认情况下,通过System.gc() 或者Runtime.getRuntime().gc()的调用,会显示的触发Full GC,同时对老年代和新生代进行回收,尝试释 ...

  8. 【java】调用System.gc()会发生什么?

    1.概述 转载:调用System.gc()会发生什么? System.gc(); //告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的 System.runFinalization( ...

  9. (转)调用System.gc没有立即执行的解决方法

    调用System.gc没有立即执行的解决方法 查看源码 当我们调用System.gc()的时候,其实并不会马上进行垃圾回收,甚至不一定会执行垃圾回收,查看系统源码可以看到 /*** Indicates ...

最新文章

  1. java菱形乱码 编码_JAVA:编码与乱码问题
  2. c++11 function
  3. word中用EndNote引用文献,之后再打开插入新文献,格式显示错误的问题
  4. 企业微信万亿级日志检索系统
  5. asp.net core自定义依赖注入容器,替换自带容器
  6. 【渝粤题库】陕西师范大学163202 管理学原理 作业(高起本 专升本)
  7. 移植驱动完毕后加载时的version magic报错原因以及解决办法
  8. chrome麦克风权限_如何在Chrome扩展程序中处理麦克风输入权限和语音识别
  9. python安装rarfile模块_python模块整理7-zipfile模块
  10. 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...
  11. 【Python基础】with语句
  12. 1、金融企业信息化建设的必要性
  13. IFIX组态-----通过按钮弹出、关闭子画面
  14. 黑马程序员----------Java新特性反射 泛型
  15. Docker - 相较于虚拟机的优势,以及为什么要使用docker
  16. 苹果home兼容问题修改--苹果fixed定位被遮挡-或者距离太近
  17. 【微信小程序经验】各类图表相关组件+Demo源码(折线图,柱状图,K线,分时图)
  18. 迅为i.MX6ULL终结者进程基础-进程创建
  19. 奈雪的茶布局元宇宙 传统品牌如何转战元宇宙营销
  20. 20176408李俊 线性表

热门文章

  1. [蓝桥杯2019初赛]数的分解-枚举
  2. 二分+最大化最小值 River Hopscotch POJ - 3258
  3. word List 33
  4. Hibernate懒加载问题的5种解决方案
  5. P6378 [PA2010] Riddle 2-sat + 前缀和优化建图
  6. 快速沃尔什变换:从入门到背板(含推导过程)
  7. Vases and Flowers HDU - 4614
  8. Shift and Reverse
  9. 二分图匹配--匈牙利算法
  10. 洛谷P7518:宝石(倍增、可撤销并查集)