为什么JAVA的垃圾回收机制无法避免内存泄漏


package com.code.revisited.memoryleaks; import java.util.Iterator;
import java.util.NoSuchElementException; /**
* @author sureshsajja
*
*/
public class Stack<E> implements Iterable<E> { private int N;
private E[] array; @SuppressWarnings("unchecked")
public Stack(int capacity) {
array = (E[]) new Object[capacity];
} @Override
public Iterator<E> iterator() {
return new StackIterator();
} private class StackIterator implements Iterator<E> { private int i = N - 1; @Override
public boolean hasNext() {
return i >= 0;
} @Override
public E next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return array[i--];
} @Override
public void remove() {
throw new UnsupportedOperationException(); } } public void push(E item) {
if (isFull()) {
throw new RuntimeException("Stack overflow");
}
array[N++] = item;
} public E pop() {
if (isEmpty())
throw new RuntimeException("Stack underflow");
E item = array[--N];
return item;
} public boolean isEmpty() {
return N == 0;
} public int size() {
return N;
} public boolean isFull() {
return N == array.length;
} public E peek() {
if (isEmpty())
throw new RuntimeException("Stack underflow");
return array[N - 1];
} }
类com.code.revisited.memoryleaks.StackTest用于执行栈操作。要进行入栈及出栈10000次操作,理想是入栈时分配堆内存,出栈后对象被回收。
package com.code.revisited.memoryleaks; /**
* @author sureshsajja
*
*/
public class StackTest { /**
* @param args
*/
public static void main(String[] args) {
Stack<Integer> s = new Stack<Integer>(10000);
for (int i = 0; i < 10000; i++) {
s.push(i);
} while (!s.isEmpty()) {
s.pop();
}
while (true ) {
// do something
} } }
package com.code.revisited.memoryleaks; /**
* @author sureshsajja
*
*/
public class StackTest { /**
* @param args
*/
public static void main(String[] args) {
// Stack<Integer> s = new Stack<Integer>(10000);
// for ( int i = 0; i < 10000; i++) {
// s.push(i);
// }
//
// while (!s.isEmpty()) {
// s.pop();
// }
while (true ) {
// do something
} } }
把栈操作的设为1号,没有栈操作的设置为2号,分别生成Heap Dump文件,我们看一下类实例的截图:


为什么JAVA的垃圾回收机制无法避免内存泄漏的更多相关文章
- js 垃圾回收机制和引起内存泄漏的操作
垃圾回收机制 JS中最常见的垃圾回收方式是标记清除. 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”.当变量离开环境时,则将其标记为“离开环境”.标记“离开环境”的就回收内存. 工作流程: ...
- 记录Java的垃圾回收机制和几种引用
一.Java的垃圾回收机制 Java的垃圾回收机制(java garbage collection)是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的堆内存空间. ...
- 了解java中垃圾回收机制
Java的垃圾回收机制是Java环境自带有的,它不像c语言的malloc申请空间后需要Free()函数来释放,而Java中的代码块中所申请的空间可在程序执行完成后自动释放,但是是有局限性的,代码块所占 ...
- 面试官,不要再问我“Java GC垃圾回收机制”了
Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...
- 【Java学习笔记】Java的垃圾回收机制
搬以前写的博客[2014-12-30 15:07] 以前很少关注内存的问题,基本没有关注,这方面的小白,原因在于自己都是写的自我娱乐的小程序,不关注性能,不是提供服务.而企业级别的应用在程序稳健性方面 ...
- JVM系列(三):java的垃圾回收机制
java垃圾回收机制介绍 上一篇讲述了JVM的内存模型,了解了到了绝大部分的对象是分配在堆上面的,我们在编码的时候并没有显示的指明哪些对象需要回收,但是程序在运行的过程中是会一直创建对象的,之所 ...
- JAVA的垃圾回收机制
1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...
- 全面分析Java的垃圾回收机制
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间.Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new.newarray.anewarray和mult ...
- java JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
随机推荐
- Hybrid App开发者一定不要错过的框架和工具///////////z
ionicFramework 我是hybrid app的忠实粉丝和大力倡导者,从 新浪移动云开始就不断的寻找能帮助Web程序员开发出漂亮又好用的UI层框架.在历经了jqmobile.sencha to ...
- 1-MySQL命令行
0.显示数据库 show databases; 1.选择数据库 use 数据库名; 2.显示数据库中的表 show tables; 3.显示数据表的结构 describe 表名; 4.显示表中记录 S ...
- NSAttributedString字符串属性类
//定义一个可变字符串属性对象aStr NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc]initWithStri ...
- Magento-找出没有图片的产品
最近维护网站,发现网站的产品很多都没有图片显示,看了一下是因为没有在后台勾选图片,就是 image small_image thumbnail 这三项,就算有图片如果没有勾选的话也不会显示出来,产品 ...
- Hash
创建(特殊的) Hash[] Hash[‘a’,1,’b’,2]->yes Hash[‘a’,1,’b’,’b’]->no Hash[[[‘a’,1],[‘b’,2]]]->yes ...
- 这次是Selenide测试自动发送博客
asdfasfdfsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdsfasdfdas
- Linux:-杀进程的技巧
<---kill进程的技巧---> 1.杀掉某个关键字的进程 pgrep -f 2.批量杀掉某个关键字的进程 pkill - "name" 3.批量杀掉多个关键字的进程
- Ubuntu14 sudo apt-get install apt-show-versions出错
vmware安装ubuntu后,sudo apt-get install apt-show-versions出现问题 E: Unable to locate package apt-show-vers ...
- JS的兼容函数
获取类名的兼容函数 //obj.getElementsByClassName 只能在现代浏览器中使用,不能在IE8以下使用 //两个参数 classname 类名 obj 范围 function ge ...
- Http状态码(转)
什么是Http状态码?(转自http://bbs.tui18.com/thread-11597640-1-1.html) 百度百科上解释为:HTTP状态码(HTTP Status Code)是用以表示 ...