编写对GC友好又不泄漏的代码

1.使用更多生命周期短的、小的、不改变指向(immutable)的对象,编写清晰的代码。

出于懒惰也好,朴素的节俭意识也好,我们都习惯对一个变量重用再重用。但是....

Java的垃圾收集器喜欢短生命周期的对象,对象如果在新生代内,在垃圾收集发生前就死掉了,垃圾收集器就什么都不用做了。
现代JVM构建一个新对象只需要10个本地CPU指令,并不弱于C/C++。 (但垃圾收集没有压缩算法时会稍慢,更频繁的New对象也导致更频繁的GC)。
大对象的分配效率更低,而且对非压缩算法的垃圾收集器,更容易造成碎片。
对象重用增加了代码的复杂度,降低了可读性。
   所以有标题的呼吁,比如不要害怕为中间结果分配小对象。但编程习惯的改变也不是一朝一夕的事情。

2.将用完的对象设为NULL其实没什么作用。

貌似很酷的把对象主动设为Null 的"好习惯"其实没什么用,JIT Compiler会自动分析local变量的生命周期。
    只有一个例外情况,就是String[1024] foo 这种赤裸裸的数组,你需要主动的foo[100]=null释放第100号元素,所以最好还是直接用ArrayList这些标准库算了。

3.避免显式GC--System.gc()。

大家都知道System.gc()不好,full-gc浪费巨大,gc的时机把握不一定对等等,甚至有-XX:+DisableExplicitGC的JVM参数来禁止它。

哈哈,但我还不会用System.gc()呢,不怕不怕。真的不怕吗?

先用FindBugs 查一下所用到的全部第三方类库吧...
至少RMI 就会老实不客气的执行System.gc()来实现分布式GC算法。但我也不会用RMI啊。那EJB呢,EJB可是建在RMI上的....
    如果无可避免,用-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 (单位为微妙) 增大大GC的间隔(原默认值为1分钟),-XX:+ExplicitGCInvokesConcurrent 让System.gc() 也CMS并发执行。

4.继续千夫所指的finalize()

大家也都知道finalize()不好,分配代价昂贵,释放代价更昂贵(要多走一个循环,而且他们死得慢,和他们相关联的对象也跟着死得慢了),又不确定能否被调用(JVM开始关闭时,就不会再进行垃圾收集),又不确定何时被调用(GC时间不定,即使system.gc()也只是提醒而不是强迫GC,又不确定以什么样的顺序调用,所以finalize不是C++的析构函数,也不像C++的析构函数。

我们都知道啊,所以我从来都没使用。都是在显式的维护那些外部资源,比如在finally{}里释放。

时间: 2025-01-19 09:59:22

编写对GC友好又不泄漏的代码的相关文章

PHP将DateTime对象转化为友好时间显示的实现代码

PHP将DateTime对象转化为友好时间显示的实现代码,需要的朋友可以参考下. /** * 友好日期时间 * * @param DateTime $datetime 日期时间 * @param int $size 精确到位数 * @throws InvalidArgumentException * @return string */ function friendly_date($datetime, $size=1) { if (is_int($datetime)) { $datetime =

windows-软件Visual C++ 6怎么利用MFC编写Windows控制台应用程序,帮忙补下代码

问题描述 软件Visual C++ 6怎么利用MFC编写Windows控制台应用程序,帮忙补下代码 过程步骤: 新建一个名称为MFCConsole的工程,工程的类型是Win32 Console Application,并且选择An empty project.完成之后插入一个C++源文件,文件名为MFCConsole.cpp,并输入如下代码. 程序.MFCConsole.cpp 这是书上代码. #include #include #include CWinApp theApp; int _tma

c#-windows phone开发:如何利用编写C#将后台新添加的XAML代码永久存入XAML文件中?

问题描述 windows phone开发:如何利用编写C#将后台新添加的XAML代码永久存入XAML文件中? 具体来说就是,假如我是用动态添加控件的方式添加按钮,那再次启动软件时前次添加的按钮将会消失.其原因就是这些按钮并没有加载到XAML页面文件里.怎么样将新添的XAML代码,用C#程序保存进XAML文件中? 我是开发小白,谢谢各位了 解决方案 这个想法挺好,动态添加,建议你采用代码,直接打开xaml文件,把代码写进去,你也可以在程序中每次运行程序时都执行一下动态添加控件的代码,也一样可以实现

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带 来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本

求一个c#编写的c/s结构的上传代码

问题描述 求一个c#编写的c/s结构的上传代码各位好心人说能帮个忙小弟想找一个c#写的c/s结构的上传代码可以将本地文件上传到远程服务器上,谢谢各位了 解决方案 解决方案二:WebClientweb=newWebClient();web.UploadFile("http://web/upload/t.txt","c:\t.txt");

编写手机端自适应页面案例,springMVC代码,SpringMVC上传代码,去掉input框中原有的样式,使ios按钮没有圆角,css中的border-radius类似

1.编写的页面 <%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-/

JavaScript编写检测用户所使用的浏览器的代码示例_javascript技巧

能力检测在编写代码之前先检测特定浏览器的能力.例如,脚本在调用某个函数之前,可能要先检测该函数首付存在.这种检测方法将开发人员从考虑具体的浏览器类型和版本中解放出来,让他们把注意力集中到相应的能力是否存在上.能力检测无法精确地检测特定的浏览器和版本. 怪癖检测怪癖实际上是浏览器实现中存在的bug,例如早期的webkit中就存在一个怪癖,即它会再for-in循环中返回被隐藏的属性.怪癖检测通常涉及到运行一段代码,然后确定浏览器是否存在某个怪癖.由于怪癖检测无法精确地检测特定的浏览器和版本. 用户代

php编写批量生成不重复的卡号密码代码_php技巧

闲的蛋疼的时候,顺便加强下自己对PHP中数组操纵的一些技巧,就写了下面的一段小代码,可以随机生成卡号密码对应的数组,并且自动去重复,思路没有,纯粹瞎掰. <?php header('Content-Type:text/html; charset=utf-8'); function MakeCard() { set_time_limit(0); //处理缓冲区 ob_end_clean(); ob_implicit_flush(true); echo str_pad(" ", 25

PHP将DateTime对象转化为友好时间显示的实现代码_php技巧

复制代码 代码如下: /** * 友好日期时间 * * @param DateTime $datetime 日期时间 * @param int $size 精确到位数 * @throws \InvalidArgumentException * @return string */ function friendly_date($datetime, $size=1) { if (is_int($datetime)) { $datetime = new \DateTime($datetime); }