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. 码农深耕 - 说说IDisposable

    概要 C#提供了方便的垃圾回收机制,使我们几乎不再需要为资源管理费心.可事实上,能被垃圾回收释放掉的只是托管资源,非托管资源还是需要我们手动释放.而为了实现这一目的,C#提供了 IDisposable ...

  2. poj_1836 动态规划

    题目大意 N个士兵排成一排,不是按照高度顺序排列.现在想要从中去掉几名士兵,从而使得队伍中剩余的士兵能够看到这排最左边或者最右边的那个士兵,某士兵能够看到最左边(或最右边)的士兵指这名士兵和最左边(或 ...

  3. 【黑金原创教程】【TimeQuest】【第五章】网表质量与外部模型

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  4. SSH电力项目九--运行监控首页显示

    需求:在首页显示出设备运行情况,并去掉<br>换行符,每隔十分钟刷新一次页面. ElecMenuAction.java 首先注入运行监控service public class ElecM ...

  5. eclipse中的SVN文件还原到历史版本

    转载自:http://www.softown.cn/post/103.html 由于某些特殊原因,我们可能需要将SVN资源库中的某个文件回滚到以前的某个历史版本(准确地说,这不是"回滚&qu ...

  6. springboot + ApplicationListener

    ApplicationListener自定义侦听器类 @Component public class InstantiationTracingBeanPostProcessor implements ...

  7. OpenGL编程指南第九章:纹理映射

    转自://http://blog.csdn.net/longhuihu/article/details/8477614 纹理(texture)是一块矩形数据序列,存储的数据为颜色.亮度.alpha值. ...

  8. use Properties objects to maintain its configuration Writing Reading System Properties 维护配置 系统变量

    System Properties (The Java™ Tutorials > Essential Classes > The Platform Environment) https:/ ...

  9. win10 计算器calc命令打不开

    解决方法: 1.用管理员身份运行WindowsPowerShell: 2.用控制台命令Get-AppxPackage读取微软应用列表: 3.找到NAME那里有Windows calculator的,这 ...

  10. PostgreSQL学习手册-模式Schema(转)

    原文:http://www.cnblogs.com/stephen-liu74/archive/2012/04/25/2291526.html 一个数据库包含一个或多个命名的模式,模式又包含表.模式还 ...