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. (转)Python中的random模块

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  2. JQuery------制作div模态框

    转载: http://blog.csdn.net/li_xiao_ming/article/details/6738922 如图: 代码: html(使用opacity的话content无法变为不透明 ...

  3. NestedScrollView,RecyclerView

    为什么把它们放一起呢, 是因为它有着相同的特点 在新版的support-v4兼容包里面有一个NestedScrollView控件,这个控件其实和普通的ScrollView并没有多大的区别,这个控件其实 ...

  4. jqgrid自动换行

    JQGrid表头自动换行的办法: 如果table的header部分字段太多或字段文字太长需要自动换行时,可尝试如下css. <style type="text/css" me ...

  5. Java中对List集合的常用操作(转载)

    目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引 ...

  6. rabbitmq 用户管理

    rabbitmqctl add_user root cor2016 rabbitmqctl set_user_tags root administrator http://host:15672/#/u ...

  7. poj1742 Coins【多重背包】【贪心】

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions:43969   Accepted: 14873 Descriptio ...

  8. Struts2中获取Web元素request、session、application对象的四种方式

    我们在学习web编程的时候,一般都是通过requet.session.application(servletcontext)进行一系列相关的操作,request.session.和applicatio ...

  9. [iOS微博项目 - 3.6] - 获取未读消息

    github: https://github.com/hellovoidworld/HVWWeibo   A.获取登陆用户未读消息 1.需求 获取所有未读消息,包括新微博.私信.@.转发.关注等 把未 ...

  10. app瘦身和包压缩技术有什么区别?

    APP瘦身 针对app文件中的文件进行优化,利用素材的拉伸,祛除不必要的文件,优化png, jpg素材,压缩音视频素材等方式实现app文件的减小. 包压缩技术 所谓包压缩,顾名思义就是将手游的安装包体 ...