java中引用类型

  • 强引用
Persnon  p = new Person();
当指向Person对象的引用计数为0时,Person对象才能被垃圾回收器回收。
  • 软引用
SoftReference<Person>  sr = new SoftReference<Person>(new Person());
获取软引用对象Person p = sr.get();
  当内存紧张的情况下,Person对象可能会被回收,即使它的引用计数为1
  • 弱引用
       WeakReference<String>  w = new WeakReference<String>(new string());
获取软引用对象String str  = w.get();
随时可能被垃圾回收器回收
  • 虚引用
      引用队列:当软引用或者是弱引用指向的对象被释放后,会将引用放在引用队列中(ReferenceQueue)。
      虚引用是先将引用加入队列中再释放对象。
     
ReferenceQueue<String>  rq = new ReferenceQueue<String>();
      PhantomReference<String> pr = new PhantomReference<String>(new String(), rq);
      //pr.get() 为null    rq.poll为pr
虚引用其实就是形同虚设,和没引用一样。其作用就是来检查对象是否将要被回收。并且没有get()方法来获取传入的对象。
      注:以上的sr,w,  rq都强引用,指向不同对象,而在这些对象内补使用不同的引用指向我们传入的对像。
                   参考文章1         参考文章2

JAVA内存泄露

C中通过malloc()函数申请的内存不free()的话就会引起内存泄露。JAVA中的内存泄露是创建的对象只使用一次,今后再也不会使用,但没有将其引用计数置为0(强引用),就会发生内存泄露。
内存泄露代码:
public class Stack {

private Object[] elementData;

private int size = 0;

private int capacityIncrement;



public Stack(int initialCapacity){

elementData = new Object[initialCapacity];


}



public Stack(int initialCapacity, int capacityIncrement){

this(initialCapacity);

this.capacityIncrement = capacityIncrement;


}



public void push(Object object){

ensureCapacity();

elementData[size++] = object;


}



public Object pop(){

if(size == 0){

throw new RuntimeException("空栈");


}

return elementData[--size];

}



private int size(){

return size;


}



private void ensureCapacity(){

if(elementData.length == size){

Object[] oldElements = elementData;

int newLength = 0;

if(capacityIncrement > 0){

newLength = elementData.length + capacityIncrement;

}else{

newLength = (int)(elementData.length *1.5);


}

elementData = new Object[newLength];

System.arraycopy(oldElements, 0 , elementData, 0 , size);

}

}



public static void main(String[] a){

Stack stack = new Stack(10);

for(int i=0; i<10; i++)

stack.push("element" + i);


for (int i=0; i<10; i++) {

System.out.println(stack.pop());

}

}

}
在pop()函数中存在内存泄露,当弹出一个元素时,并没有将数组的引用置为null

java内存回收的更多相关文章

  1. Java内存回收 - 落日之心的日志 - 网易博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  2. java 内存回收(GC)的方式

    java内存的管理其实就是对象内存的管理,其中包括对象的分配和释放 对应程序员来说分配对象使用new关键字,而释放一个对象只需要让它等于null,让程序不能再访问这个对象,这时对象是不可达的,GC负责 ...

  3. Java内存回收机制

    在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正 ...

  4. 图解Java内存回收机制

    在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正 ...

  5. Java内存回收(垃圾回收)机制总结

    一.背景: Java程序员编写程序时,对于新建的对象,当不再需要此对象时,不必去释放这个对象所占用的空间,这个工作是由Java虚拟机自己完成的 ,即内存回收或垃圾回收. 二.如何知道一个对象所占用的空 ...

  6. 【垃圾回收】Java内存回收实践经验 防止内存报警

    jdk6和7服务器端(-server) 默认的新生代的垃圾回收器为:PS Scavenge,老年代默认的垃圾回收器为:PS MarkSweep 目前项目使用了jdk7,tomcat7,经常出现内存堆使 ...

  7. Java内存回收机制基础[转]

    原文链接:http://blog.jobbole.com/37273/ 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了J ...

  8. 【朝花夕拾】Android性能篇之(三)Java内存回收

    在上一篇日志([朝花夕拾]Android性能篇之(二)Java内存分配)中有讲到,JVM内存由程序计数器.虚拟机栈.本地方法栈.GC堆,方法区五个部分组成.其中GC堆是一块多线程的共享区域,它存在的作 ...

  9. Java 内存回收机制——GC机制

    一.Java GC 概念说明 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾 ...

随机推荐

  1. ios开发之 -- Swap file ".Podfile.swp" already exists!

  2. 应用开发之WinForm开发

    本章简言 上一章笔者介绍了关于WinForm环境.这一章笔者将继续讲WinForm.只不过更加的面向开发了.事实就是在学习工具箱里面的控件.对于WinForm开发来讲,企业对他的要求并没有那么高.但是 ...

  3. 第十五篇:C程序的存储空间布局

    前言 C语言程序的执行必定需要耗费一定的资源,也就是说,程序在计算机内部的映像不可能就单单代码. 本文将讲解C语言程序在计算机内部的存在方式. 程序存储空间 1. 正文段:程序的机器指令部分 2. 初 ...

  4. PagerAdapter 普通写法

    1,viewPagre的普通写法 public ImagePagerAdapter(Context context, List<Photo> imgList) { this.mContex ...

  5. 用SQL语句创建触发器

    --假设XSCJ数据库中增加一新表XS_HIS,表结构和表XS相同,用来存放从XS--表 --中删除的记录.创建一个触发器,当XS表被删除一行,把删除的记录写到日--志表XS_HIS中. CREATE ...

  6. 【BZOJ2797】[Poi2012]Squarks 暴力乱搞

    [BZOJ2797][Poi2012]Squarks Description 设有n个互不相同的正整数{X1,X2,...Xn},任取两个Xi,Xj(i≠j),能算出Xi+Xj.现在所有取法共n*(n ...

  7. js 匿名函数-立即调用的函数表达式

    先提个问题, 单独写匿名函数为什么报错?return 匿名函数 为什么不报错? 如图: 第二种情况在 f 还没有执行的时候,就报错了,,,当然这得归因于函数声明语句声明提前(发生在代码执行之前)的原因 ...

  8. js apply()、call() 使用参考

    引入,求一个数组的最大值,有这么一种快捷方法:Math.max.apply(null,arr); 但是最初看 JavaScript高级程序设计 的时候,没看懂,原文(斜体表示)如下: 每个函数都包含两 ...

  9. error.log worker_connections exceed open file resource limit: 1024

    不按照预期响应请求 nginx.conf中worker_connections 与ulimt -n 配置的冲突

  10. What’s wrong with virtual methods called through an interface

    May 31, 2016 Calling a virtual method through an interface always was a lot slower than calling a st ...