前言
堆中存放对象,栈中存放基本类型和堆中对象的引用
一个Object对象占用4+8bytes, 4bytes是栈中的引用,8bytes是堆中对象的实际大小。如果这个对象有个long属性,其大小为8+4+8bytes,但是对象必须是8的倍数,所以会补齐为24bytes.
JVM中分年轻代,老年代,永久代;其中年轻代有1个Eden和2个Survivor区。
新生代GCvs老年代GC
新对象在eden区申请空间失败后会触发minor gc,将存活对象移到一个未使用的Survivor区。
当老年代,永久代,显性调用System.gc()后会进行Full GC,对整个堆进行垃圾收集,速度很慢,故要减少Full GC的次数。
几种常用的垃圾收集器
串行收集器:适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。 缺点:只能用于小型应用
并行收集器:适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。 缺点:垃圾收集过程中应用响应时间可能加长
并发收集器:适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。
当说到GC优化时,我们在说什么
- 减少Stop the world发生的时间和频率
- 减少转移到老年代对象的数量
几个建议
- 预测集合的大小,避免频繁的数组扩容
- 直接将InputStream传递给解析器,不要额外读取到byte[]
- 使用不可变对象,能够减少GC暂停时间
- 小心字符串拼接,虽然可能有编译器优化,但是可能产生大量的StringBuilder临时对象,所以还是直接使用StringBuilder吧
- 减少使用包装类的容器,包装类很浪费空间。可以使用Trove框架,保存原生的数据类型。
参考文献
http://pengjiaheng.iteye.com/category/86293
http://www.importnew.com/author/wangxiaojie
后一篇特别好