GC 是JVM的垃圾回收器。与C/C++不同,java程序员无需考虑太多内存分配的位置,更不用考虑内存释放的机制,java对象内存的申请和释放都有JVM托管。JVM的内存释放机制就是GC。
GC的过程分为获取内存释放时机、遍历无用java对象、释放算法如何选择并调度、GC的种类、JVM内存布局。
首先介绍下JVM的内存布局,在JVM中,内存分为虚拟机栈、堆区、方法区、本地方法栈、程序计数器。
程序计数器是被线程似有的,指向当前线程所执行到的字节码。
1、虚拟机栈是JVM保存待执行的java方法的数据区,所有待执行的java方法会以栈帧的数据形式出栈和入栈,这一过程也表现了java方法的执行过程。
2、本地方法栈是保存的是本地方法?(本地方法如c/c++应该和JVM在操作系统上处于同一层次,为啥能被JVM操作)本地方法栈为本地方法服务,在执行一个本地方法时,虚拟机栈会被保存状态等待本地方法返回(该虚拟机栈中的方法不会被执行引擎加载执行,而是等待方法的返回)(1、本地方法栈类似于对虚拟内存栈区的映射2、本地方法栈中压入的是本地方法的接口声明,通过执行引擎加载本地方法库来获取本地方法的实现。3、倾向于后者)。
3、方法区保存类型信息。每一个类的class信息包括类名、父类、接口,和静态变量、类方法。
虚拟机栈、程序计数器、本地方法栈都是线程所私有,方法区被线程共享,而堆区是JVM的。
4、堆区存储的是java对象、包括class对象。有JVM托管,申请和释放。堆区是GC的主战场。
-------------------------------------------------------------------
堆被划分为两大区域,young和old(老年代和新年代)。young被分为Eden,servivor1/2。新生对象内存的申请主要是在Eden和其中一块servivor中,另一块servivor作为保留,在复制-释放时,作为存活对象重新排列的容器。GC分为Major GC、 Full GC、 Minor GC。
1、GC获取内存释放时机:一般发生在new时即JVM分配堆区内存的时候。当Eden区满的时候触发Minor GC,当old满时触发Full GC
GC的策略有复制-释放、标记-释放两种。复制释放就是遍历获取无用的java对象,将仍然存活的对象复制到另一块内存中,再将第一块内存中的所有对象全部释放。标记-释放就是先遍历获取无用的java对象,标注标记,在第二次遍历时将标记的对象释放。复制释放的优点是存活对象将获得重新排列,降低了内存碎片的产生;缺点是必须有另一块足够的内存来容纳存活对象,同时复制花费了大量的开销。标记-释放的优点是无需复制的开销和第二块内存的开销,缺点是产生内存利用率降低,内存碎片的数量大大增加甚至导致大块内存无法申请。
在JVM采用自适应的方式通过存活内存的多少、在堆区中排列松紧判断采用复制-释放还是标记-释放。当不在使用的对象的数量较少时使用标记-释放,当对象排列松散、内存碎片过量时使用复制-释放。
2、获取无用对象:怎样获取不再使用的对象呢,JVM使用从root节点搜索的方式,从root节点遍历对象链表,与root节点不连续的java对象即是不适用的对象,该对象将被释放。
3、如何调度:上文说道,JVM将采取自适应的方式调度释放算法,堆内存的划分就是由此而来。Eden区和其中一块servivor将作为内存申请的区域,而另一块servivor将用来在复制-释放时保存重新排列的对象,然后新的内存申请就将在后一块servivor和Eden中进行,而前一块用来保存下一次GC存活下来的对象。old域中保存的对象是永久或者长久存在的对象,经过多次GC后没有被释放,就会被移交到old中,由此可知,新生代young中保存的多是存活周期比较短的,比较久的会在多次GC没有释放后移交到老年代old中。所以Eden的内存被设计得远远大于servivor1/2,(在GC后young中仍然存在的内存是比较少的一部分,一个servivor就能保存)。

-------以后配图说明。

JVMGC机制的更多相关文章

  1. 笔记:Binder通信机制

    TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...

  2. JAVA回调机制(CallBack)详解

    序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...

  3. 谈谈DOMContentLoaded:Javascript中的domReady引入机制

    一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...

  4. 路由的Resolve机制(需要了解promise)

    angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...

  5. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  6. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  7. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  8. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  9. 操作系统篇-分段机制与GDT|LDT

    || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的. ...

随机推荐

  1. oracle10g 基于linux6安装问题收集

    1.[oracle@rsyslogserver database]$ dbca -silent -responseFile /home/oracle/database/dbca.rsp No comm ...

  2. .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧

    一.前言 为什么要调试代码?通过调试可以让我们了解代码运行过程中的代码执行信息,比如变量的值等等.通常调试代码是为了方便我们发现代码中的bug.ken.io觉得熟练代码调试技巧是成为合格程序员的基本要 ...

  3. 痛吻过YY寻找到真爱的三非渣本春招之路

    写下这篇文章可能就不是大家乐于见闻的面经了,更多是深入一些面试细节. 前言 我猜拿到了BAT等一线互联网公司Offer的小伙伴或者那些老鸟看到这条标题的时候会不屑一顾,认为YY这种级别的公司是属于二线 ...

  4. [poj3904]Sky Code_状态压缩_容斥原理

    Sky Code poj-3904 题目大意:给你n个数,问能选出多少满足题意的组数. 注释:如果一个组数满足题意当且仅当这个组中有且只有4个数,且这4个数的最大公约数是1,$1\le n\le 10 ...

  5. python(函数)

    Python中的namespace Python中通过提供 namespace 来实现重名函数/方法.变量等信息的识别,其一共有三种 namespace,分别为: local namespace: 作 ...

  6. 【django之stark组件】

    一.需求 仿照django的admin,开发自己的stark组件.实现类似数据库客户端的功能,对数据进行增删改查. 二.实现 1.在settings配置中分别注册这三个app # Applicatio ...

  7. Mysql性能优化之覆盖索引

    因为我们大多数情况下使用的都是Innodb,所以这篇博客主要依据Innodb来讲 b+树(图片来自网络) b+树图来自网络 1.聚集索引与非聚集索引区别 聚集索引:叶子节点包含完整的数据(物理地址连续 ...

  8. 福州大学软工1715|W班-启航

    新的一学期即将开启,而在仅剩的几天的时间内,我将为接下来的软工实践助教事宜忙碌起来.要学习的东西很多,要关注的东西也很多. 虽然我现在还在茫然阶段,虽然我对<构建之法>还不太熟悉,但是,我 ...

  9. C语言第二周作业——分支结构

    一.PTA实验作业 题目1.7-1计算分段函数 本题目要求计算下列分段函数f(x)的值: 1实验代码 double x,result; scanf("%lf",&x); i ...

  10. C/C++生成随机数

    一.rand和srand   在C++11标准出来之前,C/C++都依赖于stdlib.h头文件的rand或者srand来生成随机数.   其不是真正的随机数,是一个伪随机数,是根据一个数(我们可以称 ...