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. C#获取C++中修改过的float数组(指针),dll

    C++中 struct rankPoint{ float sim; }; ]){ ; i < ; i++) prank[i].sim = ; ; i < ; i++) prank[i].s ...

  2. javascript序列化

    JSON.stringify() JSON.parse() toJSON() var person={"cardId":"546651353435"}; con ...

  3. C#------对SQLServer进行简单的增,删,改,查

    EF中的操作转载: http://www.cnblogs.com/mcgrady/archive/2015/03/21/4355282.html PSContext db = new PSContex ...

  4. tomcat十大安全优化措施

    1.telnet管理端口保护 使用telnet连接进来可以输入SHUTDOWN可以直接关闭tomcat,极不安全,必须关闭.可以修改默认的管理端口8005改为其他端口,修改SHUTDOWN指令为其他字 ...

  5. Linux下Redis服务器安装配置

    说明:操作系统:CentOS1.安装编译工具yum install wget  make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel ...

  6. 知乎布局||offsetTop||侧边栏自动等高

    1.对a标签的详细介绍 直接在a标签使用onclick,怎么去除a的默认链接,onclick="return test()" 注意这里的return 不可舍去,test函数可以直接 ...

  7. ECSHOP MYSQL 公用类库中的autoExecute方法

    include/cls_mysql.php 正常操作 例如: $sql = “UPDATE ecs_user SET user = ‘buxuan’ WHERE user_id = ″; $db-&g ...

  8. GPRS/3G

    像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时. 所以用 状态机 + 超时 的机制来实现比较合理. 如下代码片段来描述数据透传 : 状态机 + 超 ...

  9. Ubuntu如何以root身份登陆-(基于14.04版本)

    1.打开terminal,输入命令 $ sudo passwd root 键入密码, 重复确认, 2.然后再次在终端模式下进入root, $ sudo -s -H 键入密码 # vi  /usr/sh ...

  10. zencart分类页产品页去掉url中的id号

    最近公司新上的网站被seo指出要修改url,去掉url中产品id.由于我们用的是zencart框架,装了 Ultimate SEO URLs 插件,所以在网上应该有这方面的资料,本文主要参考资料: 原 ...