在写这篇文章之前,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. 安卓WindowManager注入事件如何跳出进程间安全限制

    在分析monkey源码的时候有些背景知识没有搞清楚,比如在看到monkey是使用windowmanager的injectKeyEvent方法注入事件的时候,心里就打了个疙瘩,这种方式不是只能在当前应用 ...

  2. 国内首篇介绍JanOS物联网操作系统的文章 - 如何把你的手机主板打造成物联网平台

    天地会珠海分舵注:如无意外,您现在正在看的将是国内首篇且是唯一一篇介绍炙手可热的物联网的操作系统JanOS的文章!不信你去百度!希望大家能喜欢.但本文只是引言,更多信息请还是访问JanOS的官网:ht ...

  3. C#中使用REDIS

    C#中使用REDIS 上一篇>> 摘要 上一篇讲述了安装redis客户端和服务器端,也大体地介绍了一下redis.本篇着重讲解.NET4.0 和 .NET4.5中如何使用redis和C# ...

  4. Javascript--dataTransfer

    描述: 提供对于预定义的剪贴板格式的访问,以便在拖拽中使用 属性 描述 参数 dropEffect[=sCursorStyle] 设置或获取拖拽操作的类型和要显示的光标类型 可选的copy 复制样式被 ...

  5. ”Validation of viewstate MAC failed” 错误

    ”Validation of viewstate MAC failed” 错误 在ASP.NET里面,View State使用较为广泛.它作为一个隐藏字段,可以帮助服务端”记住“客户端的改变,这样客户 ...

  6. leetcode第28题--Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运 ...

  7. Android-异步图像装载机

    在ListView加载图像是非常常见的场景,图像加载几个要求满足以下的: (1)是否画面位于网络或本地上,装载不应同步.但应该异步加载,例如,使用AsyncTask. (2)为了避免重复下载图片和网页 ...

  8. [转]Windows下搭建PHP开发环境

    原文:http://www.cnblogs.com/pharen/archive/2012/02/06/2340628.html PHP集成开发环境有很多,如XAMPP.AppServ......只要 ...

  9. 基于MEF的插件框架之总体设计

    基于MEF的插件框架之总体设计 1.MEF框架简介 MEF的全称是Managed Extensibility Framework(MEF),其是.net4.0的组成部分,在3.5上也可以使用.熟悉ja ...

  10. TodoList开发笔记 – Part Ⅲ

    本节开始对TodoList项目的客户端进行开发 一.初步了解JQuery 其实我在学校时有接触过一段时间的Web开发,虽然代码量不多也不复杂,但也已经感受到了各浏览器对Web各项标准的恶意,Web界对 ...