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初步的更多相关文章

  1. JVM探秘:GC日志收集与分析

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 收集GC日志 不同的垃圾收集器,输出的日志格式各不相同,但也有一些相同的特征.熟悉各个 ...

  2. 你的JVM还好吗?GC初步诊断

    你的JVM还好吗?GC初步诊断   阿飞的博客   JVM的GC机制绝对是很多程序员的福音,它让Java程序员省去了自己回收垃圾的烦恼.从而可以把大部分时间专注业务身上,大大提高了业务开发速度,让产品 ...

  3. JVM探秘:MAT分析内存溢出

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory A ...

  4. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分 ...

  5. JVM内存管理------GC简介

    为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题,很多时候会让 ...

  6. GC之三--GC 触发Full GC执行的情况及应对策略

    1.System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数. ...

  7. JVM系列二:GC策略&内存申请、对象衰老

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

  8. JVM学习之GC常用算法

    出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪 ...

  9. jvm系列:Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

随机推荐

  1. WebApi 实例

    REST是设计风格而不是标准. webapi有自己的路由. webservice和wcf的协议都是soap协议,数据的序列化和反序列化都是soap的格式.而webapi是Json的数据传递 webap ...

  2. Vmware 可用的激活码

    4F207-8HJ1M-WZCP8-000N0-92Q6G 0A6Z5-8H1EJ-WZCL1-PK072-23DJG 0F0Q9-8F38L-RZXT9-4U054-ACW5F JA02E-09H4 ...

  3. Vue系列(1):单页面应用程序

    前言:关于页面上的知识点,如有侵权,请看 这里 . 关键词:SPA.单个 HTML 文件.全靠 JS 操作.Virtual DOM.hash/history api 路由跳转.ajax 响应.按需加载 ...

  4. Angular CLI的简单使用(2)

    刚才创建了myApp这个项目,看一下这个项目的文件结构.    项目文件概览 Angular CLI项目是做快速试验和开发企业解决方案的基础. 你首先要看的文件是README.md. 它提供了一些如何 ...

  5. JS浏览器获取宽高

    screen.availHeight is the height the browser's window can have if it is maximized. (including all th ...

  6. [Unity3D] 如何识别屏幕边缘

    出现的问题 Unity3D中长度单位是米 使用Screen.resolutions获取的屏幕信息单位是像素 也就是说,即使获取了屏幕相关信息及参数,也无法把信息转换成可在editor中使用的信息.当时 ...

  7. springMvc-对servletApi的支持以及把后台对象以json方式传到前台

    1.对servletApi的支持:request.response以及session.cookie的支持 2.把后台代码以json格式向前台输出: 代码: package com.java.contr ...

  8. Dll注入:注册表注入

    在系统中每一个进程加载User32.dll时,会受到DLL_PROCESS_ATTACH通知,当User32.dll对其进行处理时,会取得注册表键值HKEY_LOCAL_MACHINE\Softwar ...

  9. [转贴] ASP.NET -- Web Service (.asmx) & JSON

    [转贴] ASP.NET -- Web Service (.asmx) & JSON 以前没做过,但临时被要求 ASP.NET Web Service 要传回 JSON格式 找到网络上两篇好文 ...

  10. 如何在Java代码中使用SAP云平台CloudFoundry环境的环境变量

    本文使用的例子源代码在我的github上. 在我的公众号文章在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务介绍了如何通过Cloud Connector ...