- 浏览: 258210 次
- 性别:
- 来自: 多伦多
文章分类
- 全部博客 (127)
- Java 基础 (46)
- Java EE (3)
- Clouds (1)
- Spring 编程 (7)
- Spring Batch 编程 (1)
- Quartz 编程 (9)
- Seam 编程 (4)
- Hibernate 编程 (1)
- JSF 编程 (3)
- jQuery 编程 (3)
- Interview Question 汇总 (3)
- 日常应用 (3)
- Maven 编程 (2)
- WebService 编程 (10)
- Scala 编程 (5)
- Coherence 编程 (8)
- OO 编程 (1)
- Java 线程 (6)
- DB 编程 (2)
- WebService 安全 (4)
- Oracle Fusion 编程 (2)
- JavsScript/Ajax 编程 (1)
最新评论
-
chainal:
赞,说的很好
Scala 有趣的Trait -
wuliupo:
RRRR-MM-DD HH24:MI:SS
如何让Oracle SQL Developer显示的包含在日期字段中的时间 -
pengain:
...
使用Spring Roo ,感受ROR式的开发 -
zeng1990:
def getPersonInfo() = {
(&quo ...
Java 的继位人? - Scala简介 -
zeng1990:
我使用的是2.9.2版本的!
Java 的继位人? - Scala简介
作者:江南白衣
,最新版链接:http://blog.csdn.net/calvinxiu/archive/2007/05/22/1621051.aspx
,版权所有,转载请保留原文链接。 看到JavaOne2007上有篇《Garbage-Collection-Friendly Programming》的68页PPT,心想都2007了还谈这个基本问题,一定总结得很全面了才好意思站出来讲吧。 GC的基础概念见上篇:JDK5.0垃圾收集优化之--Don't Pause
1.使用更多生命周期短的、小的、不改变指向(immutable)的对象,编写清晰的代码。
出于懒惰也好,朴素的节俭意识也好,我们都习惯对一个变量重用再重用。但是.... 所以有标题的呼吁,比如不要害怕为中间结果分配小对象。但编程习惯的改变也不是一朝一夕的事情。
2.将用完的对象设为NULL其实没什么作用。
貌似很酷的把对象主动设为Null 的"好习惯"其实没什么用,JIT Compiler会自动分析local变量的生命周期。 3.避免显式GC--System.gc()。
大家都知道System.gc()不好,full-gc浪费巨大,gc的时机把握不一定对等等,甚至有-XX:+DisableExplicitGC的JVM参数来禁止它。 哈哈,但我还不会用System.gc()呢,不怕不怕。真的不怕吗? 如果无可避免,用-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{}里释放。 5.WeakReference/SoftReference
这是个平时不怎么会搭理,偶然知道了又觉得有用的Java特征。大家都知道Java里所有对象除int等基本类型外,都是Pass by Reference的指针,实例只要被一个对象连着,就不会被收集。 如果foo已被垃圾收集,sr.get()会返回Null; 另外还有一个ReferenceQueue的机制,使得对象被回收时能获得通知,比finalize()完全不知道GC何时会执行要聪明的多。
cleaned就是刚刚被GC掉的WeakReference。 6.内存泄漏
java 不是有垃圾收集器了吗?怎么还泄漏啊,唬我啊?? 内存泄漏的检测
有不少工具辅助做这个事情的,如果手上一个工具也没有,可以用JDK自带的小工具:
只有一个例外情况,就是String[1024] foo 这种赤裸裸的数组,你需要主动的foo[100]=null释放第100号元素,所以最好还是直接用ArrayList这些标准库算了。
而WeakReference就是真正意义上的C++指针,只是单纯的指向一个对象,而不会影响对象的引用计数。
而SoftReference更特别,在内存足够时,对象会因为SoftReference的存在而不被收集,但内存不足时,对象就还是会被收集,怎么看都是做简单缓存的料子。代码如下:
SoftReference sr
=
new
SoftReference(foo);
Foo bar
=
sr.get();
ref
=
new
WeakReference(foo, rq);
WeakReference cleaned
=
rq.pool();
嗯,此泄漏非比泄漏。C/C++的泄漏,是对象已不可到达,而内存又没有回收,真正的内存黑洞。
而Java的泄漏,则是因为各种原因,对象对应用已经无用,但一直被持有,一直可到达。
总结原因无外乎几方面:
这些集合类的生命周期通常极长,而且是一个辅助管理性质的对象,在一个业务事务运行完后,如果没有将某个业务对象主动的从中清除的话,这个集合就会吃越来越多内存,可以用WeakReference,如WeakHashMap,使得它持有的对象不增加对象的引用数。
用JDK6的jmap可以显示运行程序中对象的类型,个数与所占的大小
先用jps 找到进程号,然后jmap -histo pid 显示或 jmap -dump:file=heap_file_name pid 导出heap文件
用jhat(Java Heap Analysis Tool) 分析刚才导出的heap文件。
先jhat heap_file_name,然后打开浏览器http://localhost:7000/
浏览。
发表评论
-
设计模式之事务处理
2010-11-25 07:36 889转自 http://www.blogjava.net/kill ... -
设计自己的MVC框架(1)
2010-11-25 07:27 1226转自 http://www.blogjava.net/ ... -
设计自己的MVC框架(2)
2010-11-25 07:24 1152转自 http://www.blogjava.ne ... -
使用Annotation设计持久层
2010-11-25 06:59 919(From http://www.blogjava. ... -
Jakarta Commons StringUtils类使用
2010-11-25 06:58 910转自http://www.blogjava.net/ ... -
Jakarta Commons ArrayUtils类使用
2010-11-25 06:57 1105转自http://www.blogjava.net/ ... -
Reflection的三个动态性质
2010-11-25 06:56 989转自http://www.blogjava. ... -
用commons.fileupload实现文件的上传和下载
2010-11-25 06:55 1363转自http://www.blogjav ... -
JAVA基础:共享内存在Java中的实现和应用
2010-11-25 06:54 852(转自 http://www.bu ... -
JAVA变量类型之间的相互转换
2010-11-25 06:52 878(转自 http://www.builder.c ... -
优秀Java程序员必须了解的GC工作原理
2010-11-25 06:52 865(转自 http://www.build ... -
几种版权信息详解
2010-11-25 06:49 1106BSD开源协议(original ... -
Java JDK 1.4 JCE Provider issue.
2010-11-25 06:48 1151Bundled JCE provider in jdk1 ... -
Why use Map.entrySet() instead of Map.keySet()?
2010-11-25 06:45 1370(From http://www.coderan ... -
Credit Card Mod10 校验
2010-11-25 06:27 2022以下是几种Mod10的实现。第一种最为简洁,最后一种 ... -
如何知道方法的调用者
2010-11-25 05:57 7370转自http://hellboys.bok ... -
Java加解密的基础
2010-11-25 05:49 2801在Java的安全包中,包括了三部分内容: ... -
Java日志框架:SLF4J, Apache Common-Logging, Log4J和Logback
2010-11-25 05:47 1834Log4j Apache的一个开放源代码项目,通过 ... -
Java SE 6新特性:Instrumentation
2010-11-25 05:35 1061(转自http://baike.baidu.com ... -
JBOSS 启动 加载 过程
2010-09-11 00:26 2980(转自: http://blog.csdn.net/ylli_ ...
相关推荐
JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧
mtk6739平台gc2385像头调试代码
代码。有问题及时联系,谢谢,请支持我的作品
C++ 代码的优化器
GC2235 MTK6582代码 MTK6582_GC2235(MIPI)_Driver_20140611(1)
彩屏向上滚动显示 pink,green,red,purple,white。刷一次屏约0.8s
GC9702P DataSheet V1.0.pdf
STM32C8T6单片机,液晶驱动芯片是GC9106,1.77寸液晶。背光PWM输出,可以正常显示,可以直接显示图片
格科GC9106芯片datasheet 附带spi接口的驱动初始化代码
GC0308 MTK平台驱动,具体见附件, camera_sensor_GC0308.c camera_sensor_GC0308.h camera_info_GC0308.c camera_info_GC0308.h
GC9300,GC9306,ST7789,HX8357C屏驱动适合全志平台一系列MCU,经验证驱动加载正常,适合分辨率240x320或480x320。
原来的下载连接为 https://github.com/chewiebug/GCViewer ,上传这份代码是为了帮助无法从原连接下载的朋友,我已使用这份代码正常编译出执行文件,编译系统用的是centos7.2,在编译时,使用此命令 mvn clean ...
内容:GC9503V_DS IC规格书 适合:嵌入式开发人群,点屏过程中或者编写显示驱动时参考。
GC032A_Drive 驱动 在原厂提供的驱动中自己修改了一些效果
适用于Unity的快速、强大、GC友好的C#信号事件。_C#_下载.zip
树莓派人脸检测代码——gc
GC9106-SPI初始程序。增加了必要的延时处理和重启序列处理。
GC9A01芯片资料TFTLCD