最近开始研究jvm垃圾收集相关训
1. Java Tuning White Paper
http://java.sun.com/performance/reference/whitepapers/tuning.html
2. Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
3. Memory Management in the Java HotSpot™ Virtual Machine
d:/x学习资料/memorymanagement_whitepaper[1].pdf
4. cms gc实践总结
http://www.iteye.com/topic/473874
5.jvm垃圾收集算法简介
http://lz999.iteye.com/blog/304986
6.Java 理论与实践: 垃圾收集简史
http://www.ibm.com/developerworks/cn/java/j-jtp10283/
7.HotSpot VM 的代划分
http://www.iteye.com/topic/528721
8. java调优相关
http://www.javaperformancetuning.com/news/news113.shtml
学习笔记:
垃圾收集的职责:
分配内存
保证任何被引用的对象保留在内存,回收掉不再被引用的对象的内存
对象在被引用时被称为活着(live),对象不再被引用被称为死了(dead)或者垃圾
这个查找并释放已经使用了的对象的空间的过程,称之为垃圾回收
垃圾收集解决了许多但并不是所有的内存分配问题,例如你可以无限制的创建对象并继续引用它们直到无可用内存。垃圾收集也是一个复杂的任务,需要时间和自己的资源
这个精确的算法用于垃圾收集器组织内存以及内存的分配和释放,对程序员来说是透明的。通常分配一个大的内存池来作为堆。
垃圾收集器触发垃圾收集的时间,通常为整个堆或者堆的一部分被填充起来或者达到一定的占用百分比。
对满足期望的分配请求,这涉及到从堆里找到一个确定大小的未使用的内存块,对于大多数的动态内存分配算法的主要问题是要避免碎片
可取的垃圾收集器特点
一个垃圾收集器必须安全和全面的,那就是活着的数据不应该被错误的释放,在当少数的收集周期里无人认领的垃圾不应该继续被保留。
同样垃圾收集器高效的工作而不导致应用不工作的过长暂停是令人满意的,然而与大多数计算机相关的系统经常需要权衡时间,空间和频率。例如:如果堆的空间很小,垃圾收集会很快,但是这堆会被迅速填满,因此需要频繁的垃圾收集。相反,一个大的堆需要较长的时间才会被填满,因此垃圾收集不如之前频繁,但可能一次收集会花更多时间。
另一个不错的垃圾收集器特点是碎片限制,当内存里的垃圾对象被释放时,这可用的空间可能出现在各个区域的小块,这样有可能任何一个连续的区域能都不足够分配一个大对象,一个避免碎片的方法是压紧(compaction).
可伸缩性同样重要,多线程的应用在多处理器的系统里,分配内存不应该成为可伸缩性的瓶颈,同样,垃圾收集也不应该有这样的瓶颈。
设计选择:
当设计或者选择一个垃圾收集算法的时候会有许多的选择
串行对并行:
对于串行垃圾收集,在一个时间点里只仅会做一件事,例如,即使在多个可用CPU的情况,也只有一个用来执行垃圾收集。当使用并行收集的时候,这个垃圾收集的任务被分成多个部分,那些子部分被同时的执行分别对应不同的CPU,这些同时操作可以使得垃圾收集能更快的完成,需要牺牲一些额外的复杂性和可能的碎片。
并发对停止整个世界(Stop-the-world)
当停止整个世界垃圾收集被执行的时候,在这个垃圾收集期间,应用程序是处于完全暂停的状态的,或者一个或多个垃圾收集任务被并发的执行,与应用程序同时的进行。通常,并发垃圾收集器能同时做很多它自己的工作,但是偶尔可能也会不得不有一些小许的stop-the-world的暂停。stop-the-world垃圾收集要比并发收集简单,因为堆被冻结并且对象在收集期间并没有改变。它的缺点是造成应用的暂停结果是不能被接受的