gc为garbage collection的缩写,中文翻译为垃圾回收。垃圾为不在使用的实例、变量,回收为释放垃圾所占用的内存空间。

学习过的C语言、C++语言,是没有垃圾回收机制的,因此需要软件工程师通过编写代码释放无用变量或实例占用的内存空间。人为操作会存在遗漏的问题,因此有时会出现内存泄露等问题。

jvm中的堆是主要的内存分配区域,jvm的gc工作区域也主要在这一片内存中。

如何判断哪些内存需要回收?

引用计数法

通过记录实例变量被引用的次数,可知不再使用的内存。但是如果存在交叉引用的情况,就会出现内存泄露的问题。

可达性分析法

通过一系列称为GC Roots的实例作为起点,逐步向下递归搜索各自引用的实例,搜索所走过的路径称为引用链。当一个实例不在GC Roots为起点的引用链时,证明此实例不再被使用,其内存空间可被回收。

GCRoots包含四个部分:

  1. 虚拟机栈本地变量表中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(Native方法)引用的对象

四种引用方式:强引用,软引用,弱引用,虚引用

如何垃圾回收?

标记-清除:两个阶段,会产生内存碎片。

标记-复制:内存空间分为两个部分,将标记后存活的实例复制到另一片内存空间中,另一片内存空间清空。

标记-整理:改变标记-清除算法的内存碎片问题,将存活实例整理在一起。

分代整理:分为年轻代内存空间和老年代内存空间,年轻代内存中的对象能存活下来的很少,使用标记-复制算法,年老代内存中的对象内存储下来的较多,使用标记-清除或标记-整理算法。

由谁执行垃圾回收?

serial收集器

使用单线程标记-复制算法进行垃圾回收,程序会暂停。

ParNew收集器

Serial收集器的多线程版本,程序依然会暂停。

Parallel Scavenge收集器

类似ParNew收集器,可动态调节垃圾回收时的停顿时间,吞吐量。程序依然暂停,但暂停时间可预估。

Serial Old收集器、Parallel Old收集器

单线程版、多线程版,标记-清除算法,程序会暂停

CMS收集器

分四个阶段

(1). 初始标记,标记GCRoots能直接关联到的对象,时间很短。程序暂停

(2). 并发标记,进行GCRoots Tracing(可达性分析)过程,时间很长。程序不暂停

(3). 重新标记,修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,时间较长。程序暂停

(4). 并发清除,回收内存空间,时间很长。程序不暂停

java gc 随记的更多相关文章

  1. Java GC回收机制

    优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...

  2. 成为Java GC专家(3)—如何优化Java垃圾回收机制

    为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...

  3. jvm系列(十):如何优化Java GC「译」

    本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...

  4. Java GC性能优化实战

    GC优化是必要的吗? 或者更准确地说,GC优化对Java基础服务来说是必要的吗?答案是否定的,事实上GC优化对Java基础服务来说在有些场合是可以省去的,但前提是这些正在运行的Java系统,必须包含以 ...

  5. [面试] Java GC (未整理完)

    Java GC简介 什么是 GC ? Java程序不用像C++程序在程序中自行处理内存的回收释放.这是因为Java在JVM虚拟机上增加了垃圾回收(GC)机制,用以在合适的时间触发垃圾回收. 你都了解哪 ...

  6. [转]Java GC的原理

    Java GC(garbage collection,垃圾收集,回收) GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot 对象化的实例是放在heap堆内存中的,这里 ...

  7. Java GC的原理

    Java GC(garbage collec,垃圾收集,回收) GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot 对象化的实例是放在heap堆内存中的,这里讲的分代 ...

  8. (转)Java GC基本算法

    http://blog.csdn.net/heyutao007/article/details/38151581 1.引用计数(reference counting)    原理:此对象有一个引用,则 ...

  9. jvm系列(七):如何优化Java GC「译」

    本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章 ...

随机推荐

  1. django fileup-load

    文件上传 使用form表单类的上传 forms.py from django import forms class UploadFileForm(forms.Form): title = forms. ...

  2. Page.FindControl(string id) 与母版页结合后发现的一个问题

    MSDN上解释Page.FindControl(string id)方法用于查找指定ID的控件.例如: <asp:TextBox id="Email" runat=" ...

  3. CentOS7系统更改网卡名为eth0

    centOS7系统更改网卡名为eth0 1.编辑grub参数 [root@localhost ~]# vim /etc/sysconfig/grub 2.在GRUB_CMDLINE_LINUX行中添加 ...

  4. 「HNOI 2014」 江南乐

    \(Description\) \(n\)堆石子,每堆石子有\(s_i\)个,两个人轮流操作,每次可以将一对不少于\(F\)的石子尽量平均分成\(m\)堆,\(m\)每次自选,不能操作者输.共有\(T ...

  5. [51nod] 1090 3个数和为0 暴力+二分

    给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到 ...

  6. file.delete()的优化

    //删除暂存的pdf File file =new File(pdfFilename); file.delete(); Path path2 = Paths.get(pdfFilename); Fil ...

  7. 五,Smarty模板技术/引擎——自定义函数机制

    自建函数是smarty提供的函数,不允许修改,只能被调用: 自定义函数是自己编写函数,注册成为smarty的函数,之后可以被调用: 示例:使用smarty自定义函数的机制,编写一个函数myfun1,通 ...

  8. LVM 认知与扩容操作

    继上次 "Linux系统如何迁移至LVM磁盘"反响不错,近三百的访问量吧.这次想续写点东西,主要讲的是"LVM认知和扩容操作".因为网上大多数不准确,可能作者也 ...

  9. 干掉Vivado幺蛾子(2)-- 快速替换debug probes

    目录 1. 什么是ECO 2. 操作步骤 参考文献: 我们做项目,进入找bug阶段时,需要用ILA捕获相关的信号.之前我做项目,每改动一次探针(debug probes),都要重新综合.实现,通常要花 ...

  10. angular5给懒加载模块添加loading

    在根组件的构造函数中直接执行: this.router.events.subscribe(event=>{ if(event instanceof RouteConfigLoadEnd) { t ...