`
cuixuxucui
  • 浏览: 350761 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java gc

    博客分类:
  • java
 
阅读更多

新生代老生代参考http://www.cnblogs.com/E-star/p/5556188.html

垃圾回收算法参考http://blog.csdn.net/java2000_wl/article/details/8022293

优化参考http://www.importnew.com/author/wangxiaojie 

面向GC编程http://www.importnew.com/11372.html

Java 堆内存http://www.blogjava.net/fancydeepin/archive/2013/09/29/jvm_heep.html

面试GC问答https://www.zhihu.com/question/35164211

 

一、算法

1.引用计数法:一个对象被引用计数器加一,取消引用计数器减一,引用计数器为0才能被回收。优点:简单。缺点:不能解决循环引用的问题,比如A引用B,B引用A,但是这两个对象没有被其他任何对象引用,属于垃圾对象,却不能回收;每次引用都会附件一个加减法,影响性能。

引用计数的方法由于存在显著的缺点,实际上并未被JVM所使用。

 

2.标记清除法:分为两个阶段:标记阶段和清除阶段。标记阶段通过根节点标记所有可达对象,清除阶段清除所有不可达对象。缺点:因为清除不可达对象之后剩余的内存不连续,会产生大量内存碎片,不利于大对象的分配。由于无法找到足够的连续内存,不得不触发另一次GC。

可以做根节点的对象:

虚拟机栈(栈帧中的本地变量表)中的引用的对象

方法区中的类静态属性引用的对象

方法区中的常量引用的对象

本地方法栈中JNI(Native方法)的引用对象

 

3.复制算法:将内存空间分成相同的两块,每次只是用其中的一块,垃圾回收时,将正在使用的内存中的存活对象复制到另外一块空间,然后清除正在使用的内存空间中的所有对象,这种回收算法适用于新生代垃圾回收。优点:垃圾回收对象比较多时需要复制的对象很少,性能较好;不会存在内存碎片。缺点:将系统内存折半。 

 

4.标记压缩算法:是一种老年代回收算法,在标记清除的基础上做了一些优化,首先从根节点开始标记所有不可达的对象,然后将所有可达的对象移动到内存的一端,最后清除所有不可达的对象。优点:不用将内存分为两块;不会产生内存碎片。

 

分代算法:新生代使用复制算法,老生代使用标记清除算法或者标记压缩算法。几乎所有的垃圾回收期都区分新生代和老生带。

 

分区算法:将整个堆空间分成很多个连续的不同的小空间,每个小空间独立使用,独立回收。为了更好的控制gc停顿时间,可以根据目标停顿时间合理地回收若干个小区间,而不是整个堆空间,从而减少gc停顿时间。

 

二、新生代young generation(执行minor gc 复制算法)和老年代old generation(执行major gc或叫full gc标记清除算法)

1.为什么要分代?

总有一些对象是长期使用的,如果每次GC都扫描他们,然后发现无法回收,这样效率就很差。所以就把对象增加了一个年龄属性,这样如果每次GC都回收不掉他们,他们的年龄就增加1,慢慢地就变成老年人了。达到一定年龄后,就要分区了。老年人会离开新生代区域,进入老年代区域。这样常规的GC只扫描新生代区域,处于老年代区域的对象就不会被频繁地扫描了。

80%的对象都是朝生夕死,对于负载不高的应用,可能数月都不会发生FullGC。

 

2.新生代再细分,有三个区域:Eden区,即伊甸园区。还有2个Survivor区,即幸存者区,分别叫from和to。from和to这两块就是复制算法中提到的两块内存,它们互相复制来复制去,互相换着当from和to.当然其中有一个肯定是空的。当eden满时,minorgc开始,Eden区也会执行复制算法,把所有存活对象全部复制到to区域。from区域的对象会根据年龄决定去向,达到要求的就去老年代,没达到要求的也会进入to区域。然后,Eden和from区都会被清空。当to区域也被塞满时,所有对象都会被复制到老年区。

一个对象的一辈子:我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

新生代98%的对象都是朝生夕死,虚拟机默认eden和survivor大小比例是8;1,也就是每次只有10%的内存空间是作为to区域被浪费,而不是传统复制算法中所说的浪费一半内存。

 

三、面向GC编程优化

1.减少创建对象的数量,比如使用StringBuilder代替string

2.老年代的GC很耗时,要减少进入老年代的对象数量。比如对象池,因为对象长期存活,会晋升到老年代,影响GC效率。另外对象池通常涉及并发访问,处理同步带来的开销也很大。而重新创建一个对象的开销,可能比这两者都要小。

3.在一个非常大的方法体内,对于较大的对象,将其引用置为null,某种程度可以帮助GC。但大部分情况下这种行为意义不大。

4.一些基于数组的数据结构,例如StringBuilder、StringBuffer、ArrayList、HashMap等等,在扩容的时候都需要做ArrayCopy,对于不断增长的结构来说,经过若干次扩容,会存在大量无用的老数组,而回收这些数组的压力,全都会加在GC身上。这些容器的构造函数中通常都有一个可以指定大小的参数,如果对于某些大小可以预估的容器,建议加上这个参数。

5.尽可能缩小对象的作用域,即生命周期。如果可以在方法内声明的局部变量,就不要声明为实例变量。除非你的对象是单例的或不变的,否则尽可能少地声明static变量。

分享到:
评论

相关推荐

    Java GC的过程

    Java垃圾收集(Garbage Collection, 简称GC)是Java编程中的一项重要特性,它自动管理内存,释放不再使用的对象,避免了程序员手动管理内存可能导致的内存泄露问题。本篇将深入探讨Java中的GC过程。 一、Java内存...

    Java GC与性能调优

    Java GC与性能调优 Java GC与性能调优是 Java programming language 中非常重要的一部分,直接影响着 Java application 的性能。本文档将对 Java GC 与性能调优进行详细的介绍。 一、 Java 平台的逻辑结构 Java ...

    成为JavaGC专家PartII-如何监控Java垃圾回收

    在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项至关重要的机制,它自动管理内存,释放不再使用的对象,防止内存泄漏。本篇将深入探讨如何监控Java的垃圾回收,帮助开发者提升应用性能和稳定性。 Java...

    Java基础[Java基础]--Java GC工作原理

    ### Java GC工作原理详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其强大的功能和高效性深受开发者喜爱。Java的自动内存管理机制是其一大亮点,尤其体现在垃圾收集(Garbage Collection...

    Java_GC垃圾回收调优指南

    ### Java GC垃圾回收调优指南 #### 概述 在Java开发过程中,垃圾回收(Garbage Collection, GC)是管理内存资源的关键技术之一。合理的GC配置可以显著提高应用程序的性能和稳定性。本指南旨在帮助开发者深入理解...

    JavaGC专家指南.pdf

    Java虚拟机(JVM)是运行Java字节码的虚拟机进程。它负责在不同操作系统上...以上就是对JavaGC专家指南中提到的知识点的一个全面解析,涵盖了从虚拟机的基本概念到内存管理,再到垃圾回收和性能调优的各个重要方面。

    Java GC的副本.pptx

    【Java GC机制详解】 Java垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)的核心特性之一,它负责自动管理程序运行时的内存,有效地避免了内存泄露和溢出的问题。Java GC机制主要涉及以下几个关键方面: 1...

    JavaGC调优基础.pdf

    Java垃圾收集(Garbage Collection, 简称GC)是Java编程中一个重要的概念,它负责自动管理程序中的内存,回收不再使用的对象所占用的内存空间。GC调优是优化Java应用程序性能的关键环节,尤其是在大型系统中,正确...

    java GC手册

    GC java 手册 kindle格式 GC java 手册 kindle格式 GC java 手册 kindle格式

    Java GC笔记总纲1

    Java垃圾收集(GC)是Java编程中至关重要的一个部分,它自动管理程序的内存,以避免内存泄漏和系统资源耗尽。以下是对标题和描述中提及的知识点的详细阐述: ### 1. 基础知识 #### 1.1 常见的内存溢出 内存溢出是...

    JAVA GC 与 JVM调优1

    JAVA GC (Garbage Collection) 是Java编程语言中的一个重要特性,它自动管理程序的内存,确保不再使用的对象能够被及时回收,以防止内存泄漏。GC主要针对的是Java堆内存中的对象,这里的对象是由Java栈中的引用指向...

    Java GC on HP-UX Itanium

    【Java GC on HP-UX Itanium】和【JDK on HP-UX 简要介绍及性能调试概要】这两个主题涉及到的是Java在HP-UX操作系统上的运行环境、内存管理和性能优化,特别是针对Itanium架构的Java垃圾收集(GC)机制。以下是详细...

    Java GC 专题

    Java垃圾收集(Garbage Collection, 简称GC)是Java编程中的一个重要概念,它自动管理内存,使得程序员不必手动释放不再使用的对象,从而避免了内存泄漏的问题。本专题将深入探讨Java GC的基础知识,包括其工作原理...

    成为JavaGC专家(4)

    在第一篇文章成为JavaGC专家PartI—深入浅出Java垃圾回收机制中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章成为JavaGC...

    jvm 参数及gc详解

    Java虚拟机(JVM)是Java程序运行的基础,它的配置参数和垃圾收集(GC)机制对于优化应用程序性能至关重要。本文将深入探讨JVM参数及其与Java垃圾收集相关的知识。 一、JVM参数详解 JVM参数可以分为三类:启动参数...

    java gc调优

    Java垃圾收集(Garbage Collection, 简称GC)是Java平台中的一项重要特性,它自动管理程序的内存,使得开发者无需手动进行内存分配和释放。然而,GC调优是每个Java开发者都需要面对的挑战,因为合适的GC配置可以显著...

    成为JavaGC专家上(1)—深入浅出Java垃圾回收机制

    对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以...这是成为JavaGC专家系列文章的第一篇,本篇主要针对GC机制进行介绍,在下一篇

Global site tag (gtag.js) - Google Analytics