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. Distinct

    SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料.这将把所有的资料都抓出,无论资料值有无重复.在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况.换句话说,我们需要知道这个表格 ...

  2. 修改输入框placeholder文字默认颜色-webkit-input-placeholder

    html5为input添加了原生的占位符属性placeholder,高级浏览器都支持这个属性,例如: <input type="text" placeholder=" ...

  3. Redis学习——链表源码分析

    0. 前言 Redis 中的链表是以通用链表的形式实现的,而对于链表的用途来说,主要的功能就是增删改查,所以对于查找来说,redis其提供了一个match函数指针,用户负责实现其具体的匹配操作,从而实 ...

  4. phpmyadmin 链接远程mysql

    这个只是自己的笔记 新手 不记下来以后又忘记了~ 在这以前已经给mysql设置了可以远程连接的账户 版本 phpMyAdmin-4.2.11-all-languages 解压到D盘下www   本地环 ...

  5. Redis-cluster集群【第二篇】:redis持久化

    Redis持久化原理: Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF ...

  6. mysql中获取一天、一周、一月时间数据的各种sql语句写法

    今天抽时间整理了一篇mysql中与天.周.月有关的时间数据的sql语句的各种写法,部分是收集资料,全部手工整理,自己学习的同时,分享给大家,并首先默认创建一个表.插入2条数据,便于部分数据的测试,其中 ...

  7. 利用SoapUI 测试web service的方法介绍

    1. 简介 SoapUI是用java开发的测试web service的工具. 2. 安装 2.1. 下载地址 http://www.soapui.org/ 2.2. 安装 By downloading ...

  8. java.util.Date和java.sql.Date的区别和相互转化

    java.util.Date是在除了SQL语句的情况下面使用的.java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分它 们都有getTime方法返回毫秒数,自然就可以直接构建. ...

  9. border边框的宽度/样式/颜色 全部值

    border 用emmet写border的时候, 缩写是:bd. 不是b, 也不是bdr: b会扩展成bottom, bdr 会扩展成 border-right, border的宽度: 1px 基本上 ...

  10. 再说vundle: 完全vim字符编程的四个必须插件 - zen coding 和emmet插件的使用

    一个常识: 基本上vim插件的配置文集都是放在对应插件目录 的/autoload/ plugin_name.vim 文件中的 有四个必要/必须的插件,实现vim完全的字符界面的编程: NERDTree ...