jvm探秘之三:GC初步
GC即垃圾收集器,虚拟机的必要组成部分。
不过这里说当然是,hotspot虚拟机(jvm的主要版本)的GC机制,前面说过了jvm的组成部分,那么想当然GC只需要负责方法区和堆就好了,虚拟机栈、本地方法栈、程序计数器随线程而生,随线程而死,为毛要回收内存?
先说堆,它分为新生代和老生代,这两个东西貌似没说过,这里说一下。为了便于管理和维护,写出更优化的内存管理,jvm将堆分为新生代和老生代,新生代存储的大多都是朝生夕死的对象实例,通过众多的实验证明,一个程序的运行中这种实例往往很多,他们存在不了多少时间,所以放在新生代就够了。这就说明了一个对象被实例化之后往往都是放在新生代,如果长时间回收不掉,它依然坚挺,那么这个对象实例就会进入老生代长久保存。堆分代的重要性和实用性特别明显,减去了大量的不必要的GC时间。
标记对象:可达性分析算法
当新生代到达了某种条件,jvm将自动启动GC,首先,GC将创建若干个“GC Roots"对象作为回收起点,通过这些起点遍历所有通过引用能到达的实例,就像遍历一张图一样,那些没有被遍历到的点,就是孤点没有用处了,那么什么东西可以作为”GC Roots"呢? 嘿嘿,想一想就马上出答案了,就是常量池和虚拟机栈变量表里的那些对象引用啊!这个思想很简单,用来标记对象是否可清除。
这里就说明了一个编程的良好习惯,尽量把不用的对象引用赋空,以便GC回收。
新生代算法:复制算法
这是目前新生代GC主流算法,大意是将新生代分为两块,一块使用,另一块被保留,当内存不够时,便触发GC将有用的实例复制到被保留的那块内存去,然后便整块擦除。由于只有少量的对象得到保存,所以这种算法运行起来快了许多。
老生代算法:标记-整理算法
无论什么老年代GC收集器,貌似用的都是这个算法,将标记的内存块向一端移动,清理另一端,这种方法的效率目前没有具体的感受。
SUN公司(现在是谷歌了)开发了多种GC,已适用多变的内存状况。嗯,说了这么多,有一个重点落下了,就是GC如何启动? 这里需要考虑一个重要的问题,GC启动之后所有事物必须静止!这个很容易想明白,如果GC正在清扫内存,其他的线程照样该咋办咋办,往堆里填对象,GC一边扫,他们一边添,那内存能干净吗?数据能稳定吗? 所以GC启动之后所有的线程全部停止了!那么问题又来了,那么多线程怎么让他们说停就停呢?原来JVM在程序运行期间设置多个安全点,如果内存需要清理,那么众多的线程就会在某个安全点停下,待所有线程全部停止后,GC便开始打扫了。
好吧,这是JVM的一大硬伤,虽然GC的优化一直在继续,但运行GC永远需要时间,所以程序永远需要停顿,这对使用者来说是无法忍受的,幸好如今的GC清理几百兆的内存仅需几百毫秒,几乎感不到程序的停顿,但这只是几百兆。。。为什么JAVA写不了游戏呢?排除其他因素,GC时间对于游戏来说就是致命的了,这相当于自带延迟。
jvm探秘之三:GC初步的更多相关文章
- JVM探秘:GC日志收集与分析
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 收集GC日志 不同的垃圾收集器,输出的日志格式各不相同,但也有一些相同的特征.熟悉各个 ...
- 你的JVM还好吗?GC初步诊断
你的JVM还好吗?GC初步诊断 阿飞的博客 JVM的GC机制绝对是很多程序员的福音,它让Java程序员省去了自己回收垃圾的烦恼.从而可以把大部分时间专注业务身上,大大提高了业务开发速度,让产品 ...
- JVM探秘:MAT分析内存溢出
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory A ...
- JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)
引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分 ...
- JVM内存管理------GC简介
为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题,很多时候会让 ...
- GC之三--GC 触发Full GC执行的情况及应对策略
1.System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数. ...
- JVM系列二:GC策略&内存申请、对象衰老
JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...
- JVM学习之GC常用算法
出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪 ...
- jvm系列:Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
随机推荐
- js中函数声明先提升还是变量先提升
根据官方书籍<你不知道的javascript>(上卷)中写道: "函数会首先被提升,然后才是变量". 例子: console.log(foo); function fo ...
- cron 任务执行表达式
1.来源 开始我还不知道cron到底来源于哪里,不求甚解的我也没做过多了解,现在突然用到所以写一下. cron计划任务 其实只是linux 一个执行计划的一个工具或者执行程序. 在Linux系统中, ...
- mui的上拉下载和下拉刷新
head部分(引入mui) <link href="./resources/css/mui.min.css" rel="stylesheet" /> ...
- linux 命令——21 find(转)
在 使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命 令长度有限制,这样在find命令运行几分钟之后,就 ...
- linux 命令——6 rmdir(转)
今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删 ...
- JS中的Global对象
Global对象可以说是ECMAScript中最特别的一个对象了.因为不管你从什么角度上看,这个对象都是不存在的.ECMAScript中的Global对象在某种意义上是作为一个终极的“兜底儿对象”来定 ...
- OpenLayers项目分析——(一)项目介绍
OpenLayers 是由MetaCarta公司开发的,用于WebGIS客户端的JavaScript包,目前的最高版本是2.7 V,通过BSD License 发行.它实现访问地理空间数据的方法都符合 ...
- 使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10
使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10 [问题点数:40分,结帖人xieyongqiu] 不显示删除回复 ...
- POJ 3057 Evacuation(二分匹配)
分析: 这是一个时间和门的二元组(t,d)和人p匹配的问题,当我们固定d0时,(t,d0)匹配的人数和t具有单调性. t增加看成是多增加了边就行了,所以bfs处理出p到每个d的最短时间,然后把(t,d ...
- 【BZOJ4327】[JSOI2012] 玄武密码(AC自动机的小应用)
点此看题面 大致题意: 给你一个长度为\(len\)的文本串和\(n\)个模式串,让你求出每一个模式串的前缀与文本串的最大匹配串长度(其中模式串和文本串都只由字符'E','S','W','N'组成). ...