编写GC友好代码(1)
来源:互联网 发布:数据结构和算法的书籍 编辑:程序博客网 时间:2024/05/21 10:01
看到李建斌《JVM内存管理/GC模型/编写GC友好的代码》的ppt,将其中的实例部分摘录下来。
另外JavaOne2007上有篇《Garbage-Collection-Friendly Programming》的68页PPT,介绍得挺不错,下载地址http://img.pusuo.net/2009-08-13/110313148.pdf
•JVM喜欢生命周期短的,小的对象
另外JavaOne2007上有篇《Garbage-Collection-Friendly Programming》的68页PPT,介绍得挺不错,下载地址http://img.pusuo.net/2009-08-13/110313148.pdf
•JVM喜欢生命周期短的,小的对象
•JVM创建对象的速度非常高,已经非常接近C++
•GC回收生命周期短的对象非常高效
–前面提到的新生代复制算法,对于生命周期短的对象,不需要扫描和复制就能回收
–
对象定义在错误的范围(WrongScope)
•使用更多生命周期短的、小的、不改变指向(immutable)的对象
•不要害怕创建临时对象作为中间计算的结果
•不要滥用对象池(Object Pool)
–出于节俭的心态,程序员总是倾向于使用对象池作为缓冲
•除非创建对象的开销较大,否则对象池不一定能提高性能,反而会影响GC效率
–比如从数据库query生成对象,pooling是有帮助的;但如果不涉及到DB/IO/Network/紧张资源的对象创建,pooling反而有反效果
–对象池生命周期长,每次full gc都要处理(mark, compact,etc)
–如果涉及多线程共享问题,对象池还可能带来同步等额外开销,得不偿失
–容易产生内存泄漏
•当使用Array-based的数据结构(ArrayList,HashMap等)时,尽量减少resize
–比如new ArrayList时,尽量估算size,在创建的时候把size确定
–减少resize可以避免没有必要的array copying,gc碎片等问题
•如果一个List只需要顺序访问,不需要随机访问(Random Access),用LinkedList代替ArrayList
–LinkedList本质是链表,不需要resize, 但只适用于顺序访问
•避免Java内存泄漏
•Java内存泄漏VS C/C++内存泄漏
–C/C++内存泄漏:把东西锁到抽屉里面,但钥匙丢了(Object unreachable)
–Java内存泄漏:把有用和没用的东西都摆满房间,清洁工(GC)分不清哪些是有用的,哪些是没用的。没用的东西没办法清理。(Object reachable but unused)
•Java内存泄漏类型
–传统型:Heap越来越大,直到OOM
–临时型:Heap临时变得很大,在某个时刻会突然变很小。导致频繁Full GC
•Java内存泄漏的经典原因
–对象定义在错误的范围(Wrong Scope)
–异常(Exception)处理不当
–集合数据管理不当
–String陷阱
对象定义在错误的范围(WrongScope)
•JVM喜欢生命周期短的对象,这样做已经足够高效
0 0
- 编写GC友好代码(1)
- 编写GC友好的代码
- 编写对GC友好,又不泄漏的代码
- 编写对GC友好,又不泄漏的代码
- 编写对GC友好,又不泄漏的代码
- 编写对GC友好,又不泄漏的代码
- 编写GC友好,又不泄露的代码
- 编写对GC友好,又不泄漏的代码
- GC(GC友好编程)
- CSI-S2:编写高速缓存友好的代码
- 友好代码注释
- 对缓存的思考【续】——编写高速缓存友好代码
- csapp第六章 存储器 对缓存的思考【续】——编写高速缓存友好代码
- 编写缓存友好的程序
- 编写内存效率的java代码-面向GC
- 什么是流水线友好的代码?
- 什么是流水线友好的代码?
- c#显示友好时间代码
- dojo学习之旅【一】 入门
- iOS文件操作(NSFileManager)
- 美食菜谱将会成创业风口的两大理由
- 不可小视灰尘容易引发电脑大问题
- 关于驱动开发中mmap函数的实现
- 编写GC友好代码(1)
- 最落魄的日子你是怎样熬过来的
- 查看资源设置与设备驱动程序
- PHP过滤输出内容
- NSString用法大全
- IT人士必去的10个网站
- poj 1088 DFS+记忆化搜索
- C++课程设计 ---通讯录
- /proc/uptime详解,获取系统启动时间,系统负载率