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. JavaWeb学习笔记——Tomcat数据源

    server.xml配置数据帐号和密码等

  2. 为什么可以用while(cin)?

    为什么可以用while(cin)?   /** * @brief The quick-and-easy status check. * * This allows you to write const ...

  3. yum安装指定(特定)版本(旧版本)软件包的方法

    在命令行里输入: yum list SDL 注意这里类库的名字是区别大小写的. 参考 http://www.dabu.info/yum-install-specific-version-old-pac ...

  4. SVN合并操作实践

    大家都知道,SVN是很多公司管理代码的版本控制工具,当分支越来越多,版本迭代越来越频繁的时候,经常会出现代码冲突的头疼事儿,这里讲一下鲨鱼遇到过关于代码版本控制的一些事,最后做个小例子,看图描述. 为 ...

  5. CentOS安装oracle12C

    安装虚拟系统CentOS6.5,分配给至少1G的内存,其他条件适当高些,具体参考官方文档 一.安装数据库: 1.安装依赖软件包 yum install binutils -y yum install ...

  6. basePath = request.getScheme()+"://"+request.getServerName()+":"+r

    basePath = request.getScheme()+"://"+request.getServerName()+":"+r (2014-06-30 1 ...

  7. Linux负载均衡软件LVS简介

    Linux负载均衡软件LVS LVS集群的体系结构以及特点 1. LVS简介        LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起 ...

  8. asp.net mvc @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction区别

    转载自 :  <asp.net mvc @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction区别> 先复制过来 ...

  9. 简述frame、bounds、center

    frame是该视图在父视图坐标系统中的位置和大小.(参照父视图中的坐标系统) bounds是该视图在自身坐标系统中的位置和大小.(参照自身的坐标系统) center是该视图的中心点在父视图坐标系统中的 ...

  10. ASP.NET MVC4/5 - Ajax 防止 CSRF攻击

    前言 CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对 ...