Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题. 2.软引用(SoftReference) 如果一个对象只具有软引用,那就类似于可有可物的生活用品.如果内存空间足够,垃圾回收器就不会回收它,如果…
引言: 即使对于Java的很多老鸟来说,如果忽然问他引用的类型,大概率是一脸茫然,不知所措的-.Java中的引用还分类型,神马情况??? 本文将针对这些类型进行分析,帮助您一文知所有类型. Java的类型 在Java中存在的类型有两大阵营: 基本数据类型和Java Class. 所谓的基本数据类型包括: byte, char, int, float, double, long, boolean. 数组是一个特殊的数据结构,其中可以使用基础数据类型,也可以是各种类. 除了基本数据类型之外,就是以J…
1.引用计数算法 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1:当删除一个指向自己的指针时,计数值减1,如果计数值减为0,说明已经不存在指向该对象的指针了,所以它可以被安全的销毁了.可以很直观的用下面的图表示: 引用计数算法的优点在于内存管理的开销分布于整个应用程序运行期间,非常的“平滑”,无需挂起应用程序的运行来做垃圾回收:而它的另外一个优势在于空间上的引用局部性比较好,当某个对象的引用计数值变为0时,系统无需访问位于堆…
之前遇到了一篇好文(https://blog.csdn.net/wallwind/article/details/6889917)准备学习一下的,课程繁忙就忘记了,今日得闲,特来补一下. 自己写一遍加深一下印象. 1.引用计数算法 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量 当有一个指针指向自己时,计数器+1: 当删除一个指向自己的指针时,计数器-1 如果计数器减为0,说明不存在指向该对象的指针了所以它可以被安全地销毁了. 如图: 引用计数算法  优点:…
1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: 1 Object o=new Object();   //  强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.如果不使用时,要通过如下方式来弱化引用,如下: 1 o=null;     // 帮助垃圾收集器回收此对象  显式地设置o为null,或超出对象的生命周期…
引用 先上个示例: >>> val = [1] >>> val[0] = val >>> val [[...]] 上述代码使val中包含自身,而产生了无限递归.上述示例表明Python中的变量名为引用类型,赋值只是使得左值指向与右值相同的内存对象. is运算符可以判断两个引用是否指向了同一个对象,而==运算符判断两个引用指向的值是否相等而不关心指向什么对象. 对引用不了解的朋友,可以把Python引用与C/C++中的void *类比,不过因为垃圾回收机…
最近在看netty的时候看到直接内存的相关概念,为了更详细的了解一下具体原理,搜到了一篇不错的文章 http://lovestblog.cn/blog/2015/05/12/direct-buffer/  因为文章中又涉及到PhantomReference的概念,又为了更详细的了解一下具体原理,又搜到了另一篇不错的文章 https://blog.csdn.net/xlinsist/article/details/57089288 这些概念很多文章中都有讲解,下面主要是针对各个Reference的…
http://backend.blog.163.com/blog/static/20229412620128233285220/     内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实现的掌握是Java开发人员开发出高质量的Java系统的必备条件.最近整理了一些关于JVM内存管理和垃圾回收方面的知识,这里梳理一下,分享给大家,希望能够对Java虚拟机有更深入的了解. 1. JVM内存管理 首先,JVM将内存组织为主内存和工作内存两个部分.主内存中主要包括本地方法区和堆.每个线程都…
java 四种引用 Java4种引用的级别由高到低依次为: StrongReference > SoftReference > WeakReference > PhantomReference 1. StrongReference String tag = new String("T"); 此处的 tag 引用就称之为强引用.而强引用有以下特征: 1. 强引用可以直接访问目标对象. 2. 强引用所指向的对象在任何时候都不会被系统回收. 3. 强引用可能导致内存泄漏.…
1 Java引用介绍 Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:    强引用  >  软引用  >  弱引用  >  虚引用 ⑴强引用(StrongReference)    强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题. ⑵软引用(SoftReference) 如果一个对象只具有软…
Java中的引用类型和垃圾回收 强引用Strong References 强引用是最常见的引用: 比如: StringBuffer buffer = new StringBuffer(); 创建了一个StringBuffer类的对象,并用一个变量buffer存储对这个对象的引用.这就是个强引用. 变量持有的是这个对象的引用.通常,引用是一个对象的存储地址. Java不像C或者C++一样,Java没有取地址符号&,也没有解引用符号*或者->. 引用不同于指针,引用不能与整形进行互相转换,也不能…
在之前的文章中,已经为各位带来了JVM的内存结构与堆内存的相关介绍,今天将为为各位详解JVM垃圾回收与算法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 如何确定垃圾 想要回收垃圾,必须得先知道,哪些对象可以被认定为垃圾.关于垃圾确定方式,主要有两种,分别是引用计数法与可访问性分析法,其原理分别如下: 引用计数法 在 Java 中,引用与对象相关联,如果要操作对象,则必须使用引用.因此,可以通过引用计数来确定对象是否可以回收.实现原则是,如果一个对象被引用一次,计数器 +1,反…
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.equels(new Object());而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式. 软引用: 非必须引用,内存溢出之前进行回收,可以通过以下代码实现Object obj = new Object();S…
[转载] :http://my.oschina.net/rouchongzi/blog/171046 Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性. 一.简单过程 Java程序运行的场所是内存,当在命令行下执行: java HelloWorld 命令的时候,JVM会将HelloWorld.class加载到内存中,…
Java中提供了一个Reference抽象类,此类定义所有引用对象共有的操作,与垃圾收集器密切配合实现的.主要是为了决定某些对象的生命周期,有利于JVM进行垃圾回收.而继承此类的有四种引用,分别是StrongReference(强引用),SoftReference(软引用),WeakReference(弱引用),PhantomReference(虚引用),强度按照上面的顺序依次减弱.下面来看下四种引用的对比. 类型 调用方式 回收条件 内存泄漏 StrongReference 直接调用 不回收…
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的allocated,然后不停的~析构.于是,有人就提出,能不能写一段程序在实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢? 1960年 基于MIT的Lisp首先提出了垃圾回收的概念,用于处理C语言等不停的析构操作,而这时Java还没有出世呢!所以实际上GC并不是Jav…
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放空间,既要写构造函数,又要写析构函数,很多时候都在重复的allocated,然后不停的~析构.于是,有人就提出,能不能写一段程序在实现这块功能,每次创建,释放空间的时候复用这段代码,而无需重复的书写呢? 1960年 基于MIT的Lisp首先提出了垃圾回收的概念,用于处理C语言等不停的析构操作,而这时Java还没有出世呢!所以实际上GC并不是Jav…
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题.一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果.开发人员有可能忘记显式的调用释放内存…
背景 垃圾收集(Garbage Collection,GC),GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言. 对于Java来说,运行时区域:程序计数器,虚拟机栈,本地方法栈.这三个区域分配多少内存在类结构确定下来时就已知了(编译期可知). 而堆和方法区这两个区域则不一样,只有程序处于运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的.垃圾收集所关注的就是这部分内存. 判断对象是否存活算法 1.引用计数算法 在JDK1.2…
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的allocated,然后不停的~析构.于是,有人就提出,能不能写一段程序在实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢? 1960年 基于MIT的Lisp首先提出了垃圾回收的概念,用于处理C语言等不停的析构操作,而这时Java还没有出世呢!所以实际上GC并不是Jav…
总览 本文会介绍垃圾回收的以下几个方面. 为什么要垃圾回收 在哪里回收 哪些对象需要回收 怎么回收 HotSpotJVM中有哪些具体的回收器可以直接用. 在开始讲垃圾回收之前,先通过一张图快速回忆一下运行时内存 为什么需要垃圾回收 因为程序在运行的过程中,对象实例,变量会占据越来越多的内存,如果不及时的清理,会造成性能下降和内存耗尽的问题. 从哪里回收 堆和方法区.堆里面不再使用的对象实例,方法区里面的不再使用的常量和类. 如何判断一个对象需要回收呢? 有两种算法. 引用计数法,就是对象被引用一…
目录 1 强引用 (Final Reference) 2 软引用 (Soft Reference) 2.1 案例1: 软引用的垃圾回收 2.2 案例2: 软引用缓存的使用 2.3 软引用的应用场景 3 弱引用 (Weak Reference) 4 虚引用 (Phantom Reference) 版权声明: 本文为转载文章, 转载时有适量修改. 再次转载时请附上原文出处链接和本声明. 原文链接: https://blog.csdn.net/u013256816/article/details/50…
. jdk1.7的堆内存 1. 堆(Java堆) 堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域, 在JVM启动时创建,该内存区域存放了对象实例(包括基本类型的变量及其值)及数组(所有new的对象). 但是并不是所有的对象都在堆上,由于栈上分配和标量替换,导致有些对象不在堆上. 其大小通过-Xms(最小值)和-Xmx(最大值)参数设置, 1. -Xms为JVM启动时申请的最小内存,默认为操作系统物理内存的1/64但小于1G, 2. -Xmx为JVM可申请的最大内…
前言   在[JAVA进阶架构师指南]系列二和三中,我们了解了JVM的内存模型以及类加载机制,其中在内存模型中,我们说到,从线程角度来说,JVM分为线程私有的区域(虚拟机栈/本地方法栈/程序计数器)和线程公有区域(方法区和java堆),其中线程私有区域内存随着线程的结束而跟着被回收,GC主要关注的是堆和方法区这部分的内存. GC回收算法   GC如何确定哪些对象需要回收呢?一般而言,有两种算法:引用计数算法和可达性分析算法. 引用计数算法   为每个对象都持有一个引用计数器,初试状态为0,该对象…
一个变量指向new对象,就是引用,在java中有四种引用,分别是强软弱虚,常见的Object o = new Object(),就是强引用,垃圾回收的时候,强引用不会被回收.   公用类: public class M { @Override protected void finalize() throws Throwable { System.out.println("finalize"); } } 强:只要有引用就不会回收代码: public class T01_NormalRef…
摘要: Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区.关于对象分配内存问题,笔者的博文<JVM 内存模型概述>已经阐述了 如何划分可用空间及其涉及到的线程安全问题,本文将结合垃圾回收策略进一步给出内存分配规则.垃圾回收机制的引入可以有效的防止内存泄露.保证内存的有效使用,也大大解放了Java程序员的双手,使得他们在编写程序的时候不再需要考虑内存管理.本文着重…
合集目录 JVM专题3: GC 垃圾回收 什么是GC? 为什么要有 GC? Garbage Collection, 用于内存回收. 简述一下 Java 垃圾回收机制? 那些内存需要回收 虚拟机中程序计数器, 本地方法区, 虚拟机栈随着线程而消亡. 栈中的栈帧随着方法调入和调出而产生和消亡, 垃圾回收主要考虑的是堆和方法区. 堆中的对象实例是主要回收的内容, 需要判断是否不再被使用, 主流的虚拟机都是通过可达性算法来实现. 通过GC Root对象为起点, 从这些节点开始搜索, 走过的路径就是引用链…
什么是垃圾回收? 垃圾回收是Java中自动内存管理的另一种叫法.垃圾回收的目的是为程序保持尽可能多的可用堆(heap). JVM会删除堆上不再需要从堆引用的对象. 用一个例子解释垃圾回收? 比方说,下面这个方法就会从函数调用. void method(){ Calendar calendar = new GregorianCalendar(2000,10,30); System.out.println(calendar); } 通过函数第一行代码中参考变量calendar,在堆上创建了Grego…
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况.通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象,通过这种方式确定哪些对象是"可达的", 哪些对象是"不可达的".但是,为了保证GC能够在不同平台实现的问题,Java规范对GC的很多行为都没有进行严格的规定.例如,对于采用什么类型的回收算法.什么时候进行回收等重要问题都没有明确的规定.因此,不同的JVM的实现者往 往有不同的实现算法.(释放对象时,只要将对象所有引用赋值为…