java虚拟机之引用

强引用:

类似:object A=new Object();这样的引用,只要强引用还存在,垃圾回收期就永远不会回收被引用的对象,eg:这里的new Oject().

软引用:

一些还有用,但是非必需的的对象,对于软引用关联的对象,在系统将要发生内存泄漏之前,将会把这些对象列入回收范围,并进行二次回收,如果回收这些对象还是内存不足,就会发生内存溢出,跑出内存溢出异常。在jdk1.2之后,提供了softreference类来实现软引用。

虚引用:

称为幻影引用,幽灵引用,它是最弱的一种引用方式,一个对象是否有虚引用对其生存时间没有任何影响,也无法通过虚引用获得任何实例。设置虚引用的唯一目的是为了当这个对象被回收时,收到一个系统的通知。

从生到死的两次标记:

第一次,通过GCroot的跟搜索发现没有任何引用链相连接,则这个对象就会被进行一次标记并且进行一次筛选, 筛选条件是对象是否有必要执行 finalize()方法,当该对象没有覆盖finalize()方法或者finalize方法已经被虚拟机调用过,则虚拟机就会认为这两种情况没有必要执行。

当一个对象有必要执行finalize方法的时候,他将会被放入名为F-Queue的队列中,稍后虚拟机会自动启动一个低优先级线程finalizer执行它,该线程是指虚拟机会触发他,但是并不会去承诺执行它,因为要是一个对象在finalize中执行的很慢或循环,那么就可能回事F-Queue处于等待状态,甚至导致整个回收系统崩溃,finalize是一个对象逃离的最后一个机会,稍后GC会对对象进行第二次标记,如果对象在finalize方法中与引用链上的任何一个对象建立了引用关系,比如把自己this复制给 某个类或者变量。任何对象的finalize方法只会被系统调用一次,也就说一个对象只能拯救自己一次

时间: 2024-08-07 16:35:55

java虚拟机之引用的相关文章

Java虚拟机15:再谈四种引用状态

JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分的时候,写了很多例子详细研究了一下JVM的几种引用,对于JVM的引用理解加深了不少,因此总结写一篇文章总结并分享下. 首先,还是先从JVM四种引用状态开始,这部分摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>一书. 在JDK1.2之前,Java中的引用的定义很传统:如果re

Java虚拟机知识点【引用】

??Java虚拟机采用可达性分析算法来判断对象是否可以回收.可达性分析算法通过一系列的GC Roots对象作为起始点,向下搜索走过的路径称引用链,当一个对象到GC Roots没有任何的引用链时,证明对象是不可用的. Java中,可作为GC Roots的对象: 虚拟机栈中引用的对象 本地方法栈的JNI引用的对象 方法区静态属性引用的对象 方法区常量引用的对象 Java对引用进行了扩充,分为强引用.软引用.弱引用.虚引用四种. 强引用:(StrongReference) 强引用是使用最普遍的引用.如

Java虚拟机9:Java类加载机制

http://www.cnblogs.com/xrq730/p/4844915.html 前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述 了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用.而虚拟机如何加载这些.class文件?.class文件的信息进入到虚拟机后会发生什么变 化?这些都是本文要讲的内容,文章将会讲解加载类加载的每个阶段Java虚拟机需要做什么事(加粗标红). 类使用的7个阶段 类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期

Java虚拟机(JVM)中的内存设置详解

在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步. PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance. GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很

探讨Java虚拟机之虚拟机体系结构

自工作以上,程序因为代码越写越多,变得越来越臃肿,效率也会变得越来越低,于是我总喜欢不断去优化程序结构外,内存优化和性能调优. 要对Java程序进行内存优化和性能调优,需要了解虚拟机的内部原理,了解Java虚拟机的好处除了上述提及两点好处.从更深一点的技术层面上看,了解Java虚拟机的规范和实现,将更加有助于我们编写高效.稳定的Java代码.比如,假如了解Java虚拟机的内存模型,了解虚拟机的内存回收机制,那么我们就不会过分依赖它,而会在需要的时候显式的"释放内存"(Java代码不能显

探讨深入Java虚拟机之内存优化

上一篇我们讲述了Java虚拟机的体系结构和内存模型,那么我们就不得不说到内存泄露.大家都知道,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在大多数的情况下并不需要java程序开发人员操太多的心,但也是存在泄露问题的,只是比C++小一点.比如说,程序中存在被引用但无用的对象:程序引用了该对象,但后续不会或者不能再使用它,那么它占用的内存空间就浪费了. 我们先来看看GC是如何工作的:监控每一个对象的运

Java虚拟机内存模型

1)程序计数器:线程私有 当线程数量超过CPU数量时,线程之间根据时间片轮询抢夺CPU资源,对于单核CPU来说,每一个时刻,只能有一个线程在运行,而其他线程必须被切换出去.因此,每个线程都有一个独立的程序计数器,用于记录下一条要运行的指令,各个线程之间的计数器互不影响,是一块线程的私有内存空间.当一个线程正在执行一个Java方法时,程序计数器记录正在执行的Java字节码地址,如果执行的是native方法,则计数器为空 2)Java虚拟机栈:线程私有 同Java线程同时间创建,用于保存方法的局部变

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

Java虚拟机详解——JVM常见问题总结

[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考之前的系列文章,尤其是那篇:Java虚拟机详解04--GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾回收.类加载机制. 先把本文的目录画一个思维导图:(图的源文件在本文末尾) 一.Java引用的四种状态: 强引用:  用的最广.我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用. * 如果一个对象具有强引用,那垃圾回收器绝不会回收它*.当内存空间不足,Java虚拟机宁