在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章

如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识JVM学习笔记-内存处理文章。

因为Java中没有留给开发者直接与内存打交道的指针(C++指针),所以如何回收不再应用的对象问题,就丢给了JVM。所以接下来就介绍一下目前主流的垃圾收集器所采取的算法。不过在此之前,有须要先了解Reference

1.引用(Reference)

如果你当初还是JDK1.0或者1.1版本的开发者?可以跳过以下部分内容;如果不是的话,上面这些内容还是有参考价值的。你可能会问,Reference还有什么可讲的?还是有一点,你知道Reference有四中分类吗?这可不是孔乙己的四种“回”字写法可以类比的。讲到引用(Reference),我们最先想到的一般是:

Object obj = new Object();

这种属于Strong Reference(JDK1.2之后引入),这类Reference的特点就是,只要Reference还在,目标对象就不能被干失落。我们可以想一下为什么要干失落一些对象?很简单,因为内存不够了。如果内存狗应用,大家都或者就好了。所以当内存不都时,会先干失落一些“必逝世无疑的家伙”(上面会解释),如果这时候内存还不够用,就干失落那些“可逝世可不逝世的家伙”了。

JDK1.2之后还引入了SoftReference和WeakReference,前者就是那些“可逝世可不逝世的家伙”。当进行了一次内存清算(干失落“必逝世无疑”的家伙)后,还不够用,就再进行一次清算,此次清算的内容就是SoftReference了。如果干失落Soft Reference后还是不够用,JVM就跑出OOM异常了。

    每日一道理
风,渐渐吹起,吹乱了我的发丝,也让我的长裙有些飘动。绿叶仿佛在风中起舞,离开了树,投向了大地,却不知这样会枯萎,我弯下腰,轻轻拾起一片树叶,那非常有序的茎脉,是一种美的点缀。我有些哀叹:绿叶啊,绿叶,你这般美丽地从树上轻轻飘下,随风起舞,却不知已被人称之为落叶!

似乎WeakReference还没说呢?它是干吗的?其实就是那些“必逝世无疑的家伙”。每一次JVM进行清算时,都会将这类Reference干失落。所以一个WeakReference出身后,它的逝世期就是下一次JVM的清算。

“回”字的最后一种写法,是PhantomReference,名字很恐惧吧(Phantom是幽灵的意思)。这类Reference的唯一作用,就是当响应的Object被Clean失落的时候,通知JVM。

虽然有四中“回”字,但是Strong Reference却没有响应的类,java.lang.ref.Reference只有三个子类。

你可能会发明,在Reference这一部分,经常性的提到“清算”。什么“清算”?就是上面要说的 Garbage Collection中对“无用”对象的clean。

这是JVM的核心功能之一,同时也是为什么绝大多数Java工程师不需要像C++程序员那样考虑对象的生存周期问题。至于因此而同时致使Java工程师不能够放任自由地控制内存的结果,实际上是一个Freedom与Effeciency 之间的trade-off,而C++工程师与Java工程师恰如生存在两个适度的人,似乎“幸福生活”的天朝人民与“水生炽热”的东方庶民之间的“时而嘲笑、时而艳羡”一般。

言归正传,Garbage Collector(GC )是JVM中筛选并清算Garbage的工具。那么第一个要搞清楚的问题是,什么是Garbage?严谨的说,Garbage就是不再被应用、或者以为不再被应用、甚至是某些情况下选作“牺牲品”的对象。看上去很啰嗦,那就先懂得成“不再被应用”吧。这就出现了第二个问题,怎么判断不再被应用?这就是后面将介绍的对象标记算法(Object Marking Algorithms)

文章结束给大家分享下程序员的一些笑话语录:

自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。

---------------------------------
原创文章 By
jvm和内存
---------------------------------

jvm内存JVM学习笔记-引用(Reference)机制的更多相关文章

  1. C++内存管理学习笔记(7)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  2. C++内存管理学习笔记(5)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  3. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  4. java学习笔记09--反射机制

    java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...

  5. Storm学习笔记 - 消息容错机制

    Storm学习笔记 - 消息容错机制 文章来自「随笔」 http://jsynk.cn/blog/articles/153.html 1. Storm消息容错机制概念 一个提供了可靠的处理机制的spo ...

  6. JVM内存回收对象及引用分析

    自动垃圾回收是Java相较于C++的一个重要的特点,想了解JVM的垃圾回收机制,首先我们要知道垃圾回收是回收什么地方的垃圾,我在我的上一篇博客<JVM内存区域划分>里面有写到JVM里面的内 ...

  7. JVM调优- 学习笔记(转)

    http://blog.csdn.net/fenglibing/article/details/6321453 GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就 ...

  8. JVM&G1 GC 学习笔记(一)

    在入门学习JVM的过程中,我们需要先了解关于JVM的知识中有哪些关键词或关键术语,今天在看完书后我想记录下来. Xms64mb    虚拟机初始化时设置内存大小为64mb Xmx256mb  设定虚拟 ...

  9. jvm 内存整理 -----学习

      分为:方法区 ,堆 ,栈 ,本地栈 ,程序计数器 1.程序计数器       保存当前线程执行的字节码行号指示器,解释器工作时,都是通过改变计数器的值来获取下一条程序指令,循环.异常.跳转.分支. ...

随机推荐

  1. Pointers to classes (From the note of my firend)

     Pointers to classes Objects can also be pointed to by pointers: Once declared, a class becomes a ...

  2. 设计模式学习--Factory Method

    What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...

  3. PHP系列目录

    原文:PHP系列目录 PHP系列的对象是已经熟悉了一门或多门语言的开发人员.如果你是其中一份子,而且你也打算学习PHP,相信你根据本系列会很快掌握PHP的.欢迎大家给出意见或建议.同时也欢迎大家的批评 ...

  4. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...

  5. C# FileSystemWatcher 监视磁盘文件

    C# FileSystemWatcher 监视磁盘文件变更 简化需求:有一个简化了的需求是这样的:有一个拍照程序在运行,一旦抓拍之后则将图片文件存储至某目录,然后图片要上传至远程服务器并update数 ...

  6. 求最短路径算法之SPAF算法。

    关于求最短路径: 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra(不能求又负权边的图),接着是Bellman-Ford,它们都可以求出由 ...

  7. Plugin For KanColleViewer – Provissy Tools V1.0

    これはKanColleViewerためのプラグインです,KanColleViewerの機能を拡張する. #介绍 / Introduction / 紹介这是一个KanColleViewer(俗称”提督很 ...

  8. Using Ninject in a Web Application

    http://aidenweb.co.uk/?p=15 Using Ninject in a Web Application I have been meaning to look at Ninjec ...

  9. Orchard学习

      Data Source=.\SQLEXPRESS;Initial Catalog=Arale;Integrated Security=True;

  10. Mysql--选择适合的引擎,提高操作速度

    在MySQL 5.1中,MySQL AB引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的MySQL服务器中   一.数据引擎简介 在MySQL 5.1中,MySQL AB引入了新的插件 ...