为什么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++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
随机推荐
- BaseAdapter日常的封装
我们日常开发中BaseAdapter使用非常的多,大家有没有想过,再进一步封装,将平常使用的对象集合,利用泛型放入集合中,再也不用每次都重写那几个方法了,当然我也提供我的下载地址(https://gi ...
- 《玩转D语言系列》三、轻松大跃进,把它当C语言先用起来
前面说过,本系列文章的前提是您懂C语言,懂面向对象中的一些概念,如果没有任何变成基础,从零开始学习D语言将是一个漫长的过程,因为很多概念都要重新诠释,让一个没有基础的人经过漫长的学习过程,然后还找不到 ...
- 关于成为Java高级工程师之路
简单说明一下现状,个人目前学习使用java已经一年半,很迷茫,高不成低不就,在此列一个目标,为期18个月,再来个一年半,这样软件生涯三年后,我必须成为高级工程师! 这里涉及Java各个方面的知识,有的 ...
- Oracle11完全卸载
1.停用oracle服务:进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止 2.在开始菜单中,找到Universal Installer,运行Oracle Universal I ...
- asp.net XMLHttpRequest 进度条以及lengthComputable always false的解决办法
一直用ajax好长时间了,对其原理也有一些了解,最近由于项目需要,使用ajax异步进度条的效果,就研究了一下,用原生的XMLHttpRequest实现进度条函数,XMLHttpRequest有以下函数 ...
- Spring学习笔记1——基础知识 (转)
1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书<Expert one-on-one J2EE Design and Deve ...
- Jquery remove 高级用法
Jquery remove 高级用法 html 代码 <div class="file-image">abc1111</div><div class= ...
- 判断checkbox是否选中
一种是通过jquery A. $("[name='selectUserId']:checked").each(function () { // $(this).attr(" ...
- 最牛B的编码套路 - 呦呦鹿鸣 - 博客频道 - CSDN.NET
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- 我的Android第一章
一.android是什么 基于linux系统下开发的开源系统 二.android的具体架构是什么 硬件[智能设备底层的硬件],驱动[软件和硬件之间沟通的桥梁],Linux系统[一款功能强大代码开源的系 ...