1、java内存管理分为内存分配和内存回收,都不需要程序员负责。

2、垃圾回收的机制主要是看对象是否有引用指向该对象。
   java对象的引用包括
   强引用
  软引用
  弱引用
  虚引用

3、强引用
  是指创建一个对象并把这个对象赋给一个引用变量。
  强引用有引用变量指向时永远不会被垃圾回收。即使内存不足的时候。
4、软引用
  软引用通过SoftReference类来实现

  软引用的对象当系统内存充足时和强引用没有太多区别,但内存不足时会回收软引用的对象。

  很多对象,但是只有一个引用指向他们(可分别指定)

  public static void main(String[] args){

  //创建软引用数组
  SoftReference<Person> [] p = new SoftReference[100]; //100000
  //赋值  
  for(int i = 0; i< p.length ;i++){
     p[i] = new SoftReference<Person>(new Person("name"+i ,i));
  }
  
    //测试
  System.out.println(p[1].get());
  System.out.println(p[4].get());
   //通知系统进行回收
  System.gc();
  System.runFinalization();
  
  System.out.println("---------------");
  System.out.println(p[1].get());
  System.out.println(p[4].get());
  }

    当系统内存充足时,系统不会进行软引用的内存回收,
    当系统不足时将会回收软引用的对象。

当用 java -Xmx1m -Xms1m SoftReferenceTest 命令时强制堆内存为1m时 软引用引用对象
    将被回收。(可以创建10000个对象)

5、weakReference
    弱引用通过weakReference类来实现

public static void main(String[] args) {
   String str = new String("JAVA讲义");
//   String str = "JAVA讲义"; 这种创建是在常量池中
   //创建一个如引用对象 指向 str对象
   WeakReference<String> wr = new WeakReference<String> (str);
  
   str =null;
   //输出
   System.out.println(wr.get());//JAVA讲义
   //强制垃圾回收
   System.gc();
   System.out.println(wr.get());//null
 }

弱引用具有很强的不确定性。因为垃圾回收每次都会回收弱引用的对象。

6、虚引用
   软引用和弱引用可以单独使用,虚引用不能单独使用,虚引用的作用是就跟踪对象被垃圾回收的
   状态,程序可以通过检测与虚引用关联的虚引用队列是否已经包含了指定的虚引用,从而了解
   虚引用的对象是否即将被回收。
   PhantomReference对象实现

虚引用通过PhantomRefence类实现,它本身对对象没有影响,类似与没有应用,对象甚至感觉不到
   虚引用的存在,如果一个对象只有一个虚引用存在,那么他就类似没有应用存在。

public static void main(String[] args){
  // 创建一个对象
  String str = new String("JAVA讲义");
//  创建一个引用队列
  ReferenceQueue<String> rq = new ReferenceQueue<String>();
  //创建一个虚引用,指定引用对象.不能单独使用必须关联引用队列
  PhantomReference pr = new PhantomReference(str,rq);
  //切断强引用
  str =null;
         //试图取得虚引用对象
  System.out.println(pr.get());
  
  //垃圾回收
  System.gc();
  System.runFinalization();
  //取出引队列中的最先进入队列的引用与pr进行比较
  System.out.println(rq.poll()==pr);
  
 }
 //null
        //true
    当程序强制垃圾回收后,只有虚引用引用字符串对象将会被垃圾回收,当被引用的对象被回收后,
    对应的引用将被添加到关联的引用队列中。

7、如果使用软引用,弱引用,虚引用的引用方式引用对象,垃圾回收就能够随意的释放这些对象,
    若果希望尽可能减小程序在起声明周期中所占用的内存大小,可以灵活使用这些引用。

如果使用了这些引用就不能保留这些对象的强引用(强制引用应该置null),否则就浪费了这些类提供的任何好处。

Java学习之强引用,弱引用,软引用 与 JVM的更多相关文章

  1. java的四种引用,强弱软虚和jvm优化

    1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object();   //  强引用 当内存 ...

  2. java中的强引用(Strong reference),软引用(SoftReference),弱引用(WeakReference),虚引用(PhantomReference)

    之前在看深入理解Java虚拟机一书中第一次接触相关名词,但是并不理解,只知道Object obj = new Object()类似这种操作的时候,obj就是强引用.强引用不会被gc回收直到gc roo ...

  3. 5.9 j(java学习笔记)强软弱虚引用及WeakHashMap、IdentityHashMap、EnumMap

    一.引用分类 强:运行垃圾回收机制后也不回收,程序出现内存溢出也不回收. 软:在垃圾回收机制运行时判断内存是否已满,如果内存已满则回收,内存充足则不回收. 弱:垃圾回收机制运行后不论内存是否充足都会立 ...

  4. Java学习之二(线程(了解) JVM GC 垃圾回收)

    线程与进程(了解)→JVM→字节码→GC 一.程序 = 算法 + 数据结构(大佬) 二.程序 = 框架 + 业务逻辑(现实) 1.线程与进程.同步与异步 1.1进程是什么? 进程就是操作系统控制的基本 ...

  5. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  6. Java之强引用、 软引用、 弱引用、虚引用

    1.强引用 平时我们编程的时候例如:Object object=new Object();那object就是一个强引用了.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它. ...

  7. java基础知识再学习--集合框架-对象的强、软、弱和虚引用

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/53092 本文 ...

  8. JVM学习之强引用、弱引用、软引用、虚引用

    转自:http://my.oschina.net/ydsakyclguozi/blog/404389 多谢博主分享 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象 ...

  9. Java学习|强引用,软引用,弱引用,幻想引用有什么区别?

    在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 1 强引用 特点:我们平常典型编码Object obj = new Objec ...

随机推荐

  1. IIS Express 外部访问

    http://blog.csdn.net/zhangjk1993/article/details/36671105

  2. sp_executesql 使用

    sp_executesql 比 之前的exec @sql 区别在可以实现参数的传入传出 如 declare @sql nvarchar(2000) declare @pid varchar(20) s ...

  3. Hibernate学习总结

    首先声明这是个坑爹的框架 属于ssh经典框架中的持久层框架,说白了就是管理数据库的. 下载地址:http://hibernate.org/orm/ 这里写了版本5.2,下载下来的基本不怎么会用,因为文 ...

  4. SpringMVC处理请求流程

    SpringMVC核心处理流程: 1.DispatcherServlet前端控制器接收发过来的请求,交给HandlerMapping处理器映射器 2.HandlerMapping处理器映射器,根据请求 ...

  5. JavaWeb学习笔记——jsp:setproperty和getproperty

  6. h5移动端滑动的细节

    1.获取手指滑动的长度: var hasTouch = 'ontouchstart' in window && !isTouchPad, _start:function(e){ var ...

  7. array_filter移除空数组

    $arr = array( "0"=> "564645", "1"=>"", "2"=& ...

  8. Cobbler自动化批量部署CentOS6.5系统

    Cobbler作为一个预备工具,使批量部署Red Hat/Centos/Fedora系统更容易,同时也支持Suse和Debian系统的部署. 它提供以下服务集成: * PXE服务支持 * DHCP服务 ...

  9. jquery 匿名函数的区别

    下面两个定义函数的方法是等价的 var test = function(val){alert(val);} function test(val){alert(val);} 都是定义了一个test()方 ...

  10. Python开发【第十九篇】:Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...