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. iOS企业版使用第三方实现自动更新版本

    1.获取本地版本和互联网版本          NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];     N ...

  2. 键值编码KVC

    动态设置:setValue:属性值 forKey:属性名用于简单路径:setValue:属性值 forKeyPath:属性路径用于复合路径,例如Person有一个Account类型的属性,那么pers ...

  3. React Native 轻松集成统计功能(iOS 篇)

    最近产品让我加上数据统计功能,刚好极光官方支持数据统计 支持了 React Native 版本 第一步 安装: 在你的项目路径下执行命令: npm install janalytics-react-n ...

  4. Git 建立仓库及常用命令速查表

    Git新建仓库两种模式: 一.项目在本地时,本地初始化仓库并提交至Coding.Net 新建一个空白目录并进入,执行如下流程 1.git init2.项目代码复制到当前目录3.git add *4.g ...

  5. C语言博客作业—数据类型

    一.PTA实验作业 题目1: 1. 本题PTA提交列表 2. 设计思路 (2)if(输入的n为奇数){ for(行数小于n/2+1时){ for(空格数等于n-2*k+1) printf(" ...

  6. 项目Beta冲刺第二天

    1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是在确认需求方面花了一些时间,后来终于确认了企业自查风险模块的需求问题 今天解决的进度:根据昨天确认下来的需求,我们基本上完成了 ...

  7. 20145237 实验五《Java网络编程》

    20145237 实验五<Java网络编程> 一.实验内容 •1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: •2.利用加解密代码包,编译运行代码,一人加密,一人解密: •3 ...

  8. Flask 扩展 Flask-RESTful

    Flask路由可以指定HTTP请求方法,并在请求函数中根据不同的请求方法,执行不同的逻辑.这样实现一个Restful的请求已经相当简单了 Flask还有更简便的方法,就是其Flask-RESTful扩 ...

  9. 从PRISM开始学WPF(五)MVVM(一)ViewModel?

    从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...

  10. JAVA_SE基础——31.this关键字

    黑马程序员入学blog... 也算是学习笔记体会. this的通俗解释: 有一个A类,一个B方法,一个C变量,其中B和C都在类A中 this.B()就是调用A类中的B方法 this.C=1(假设C是一 ...