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. 仿美团ViewPager+GridView

    在接下来我要实现一个仿美团的效果 1.首先写一个登录注册界面用到了,很简单... 这里要提醒各位在调用方法时有set...     也有add....  的方法,为了严谨可以做些正则判断手机号,用se ...

  2. 简单深搜:POJ1546——Sum it up

    结束了三分搜索的旅程 我开始迈入深搜的大坑.. 首先是一道比较基础的深搜题目(还是很难理解好么) POJ 1564 SUM IT UP 大体上的思路无非是通过深搜来进行穷举.匹配 为了能更好地理解深搜 ...

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

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

  4. fullpage.js全屏滚动插件使用方法

    在移动端经常会用到全屏滚动插件,实现常见H5活动页的效果,fullpage是一个很不错的jquery全屏滚动插件 fullpage.js插件的API:http://www.dowebok.com/77 ...

  5. 160615、Spring3 MVC 拦截器拦截不到的问题

    昨天项目组有个成员使用拦截器的时候发现不起作用,后来发现了原因,在这里跟大家分享一下(主要是冲突了).分享的是一位网友写的文章,他总结的很好. com.zk.interceptors.MyInterc ...

  6. Struts2---输入验证

    1. Struts2 的验证 1). 验证分为两种: > 声明式验证* 需要解决的问题如下: >> 确定对哪个 Action 或 Model 的那个字段进行验证 >> 使 ...

  7. git学习(6)多人协作

    git学习(6)多人协作 当我们从远程仓库克隆的时候,git会自动的把本地的master和远程的master对应起来,并且远程仓库的默认名称是origin 查看远程库的信息 $ git remote ...

  8. TCP requires two packet transfers to set up the connection before it can send data

    wHTTP重用现存连接来减少TCP建立时延. HTTP The Definitive Guide 4.2.3 TCP Connection Handshake Delays When you set ...

  9. ntopng基础

    当你在本地网络监控网络流量,根据流量大小.监控平台/接口.数据库类型等等,可以有许多不同的选择.ntopng是一套开源(遵循GPLv3协议)网络流量分析解决方案,提供基于web界面的实时网络流量监控. ...

  10. 通过virt-manager 利用NFS创建、迁移虚拟机1

    NFS作为一种网络文件系统,近些年随着云计算的发展也变得越来越受欢迎.因为云环境下会部署大量的虚拟机,而在物理机发生故障的时候,云服务商必须要保障虚拟机的安全性,即不能因为物理机的故障就停止虚拟机.这 ...