JVMGC机制
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机制的更多相关文章
- 笔记:Binder通信机制
TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...
- JAVA回调机制(CallBack)详解
序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...
- 谈谈DOMContentLoaded:Javascript中的domReady引入机制
一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...
- 路由的Resolve机制(需要了解promise)
angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...
- Go结构体实现类似成员函数机制
Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...
- 操作系统篇-分段机制与GDT|LDT
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的. ...
随机推荐
- Algorithm --> 树中求顶点A和B共同祖先
树中求顶点A和B共同祖先 题目: 给定一颗树,以及两个顶点A和B,求最近的共同祖先,和包含的子顶点个数? 比如:给定如下图的树,以及顶点13和8,则共同祖先为3,以3为root的子顶点共有8个
- Algorithm --> 字母重排
字母重排 输入一个字典(用***结尾),然后再输入若干单词.没输入一个单词w,都需要在字典中找出所有可以用w的字幕重排后得到的单词,并按照字典序从小到大的顺序在一行中输出,如果不存在,输出“:(”.单 ...
- lvs(dr)+keepalived
系统:centos6.5mini 环境: 机器名 Ip地址 角色 Vip-web: 192.168.20.50 Vip-mysql: 192.168.20.60 lvs01 192.168.20.10 ...
- Factorials
Factorials 阶乘 题目大意:给你一个数n,求出n ! 的最后一个非零位. 注释:n<=4200 想法:开始的想法是觉得这道题应该比较的有趣,因为我们知道,一个数的阶乘的最后的非零位后面 ...
- Spring MVC核心技术
目录 异常处理 类型转换器 数据验证 文件上传与下载 拦截器 异常处理 Spring MVC中, 系统的DAO, Service, Controller层出现异常, 均通过throw Exceptio ...
- 开源小工具 酷狗、网易音乐缓存文件转mp3工具
发布一个开源小工具,支持将酷狗和网易云音乐的缓存文件转码为MP3文件. 以前写过kgtemp文件转mp3工具,正好当前又有网易云音乐缓存文件需求,因此就在原来小工具的基础上做了一点修改,增加了对网易云 ...
- Java基础学习笔记二十二 网络编程
络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则 ...
- C语言程序设计(基础)- 第6周作业
一.PTA作业 完成PTA第六周作业中4个题目的思路列在博客中. 1.7-1 高速公路超速处罚 2.7-2 计算油费 3.7-3 比较大小 4.7-4 两个数的简单计算器 (必须使用switch结构实 ...
- 【Alpha版本】冲刺阶段 - Day7 - 靠泊
Alpha:指集成了主要功能的第一个试用版本.在这个版本中有些小功能并未实现.事实上很多软件的 Alpha 版本只是在内部使用.给外部用户使用的 Alpha 版本会起一个比较美妙的名字,例如,技术预览 ...
- GNU/Hurd笔记整理
patch 0 关于文件锁支持的解决方案,大部分是由Neal Walfield在2001年完成的.这些补丁由Marcus Brinkmann发表,随后被Michael Banck于2002年修改了部分 ...