为什么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++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
随机推荐
- python numpy包
在numpy包中我们可以用数组来表示向量,矩阵和高阶数据结构 首先导入numpy包: from numpy import* 初始化numpy数组有多种方式,比如说 1.python列表或元祖 2.使用 ...
- C#字符串的方法
static void Main(string[] args) { StrMethod(); } public static void StrMethod() { string myString = ...
- 我的SpringMVC配置
记住所有导的包都在org.springframework.web.servlet.mvc.annotation.下而不是 org.springframework.web.protlet.mvc.ann ...
- 对属性NaN的理解纠正和对Number.isNaN() 、isNaN()方法的辨析
1.属性NaN的误解纠正 NaN (Not a Number)在w3c 中定义的是非数字的特殊值 ,它的对象是Number ,所以并不是任何非数字类型的值都会等于NaN,只有在算术运算或数据类型转换出 ...
- python之计算器(第四天)
作业: 使用正则表达式和递归实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 一.实例说明: 本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后 ...
- CSS之float样式总结
从四大开始开始慢慢接触前端,大概半年多过去了,虽然做了一些东西,但感觉有些点始终不是很清晰.有时候为了赶进度,没有太多时间对某个点进行全面深入思考分析,只能从网上搜一搜,试一试,只要效果出来了,任务就 ...
- tomcat输出servlet-api.jar - jar not loaded 解决办法
tomcat输出servlet-api.jar - jar not loaded 解决办法 启动tomcat后,控制台输出信息:WEB-INF/lib/servlet-api.jar not load ...
- 004_Intelij 使用,Anonymous Apex
插件安装好之后,就可以正常添加cloud 项目: 注意:免费使用是30天,为了不去买license,在过期后,去修改下机器的日期,这个日期是在安装后的一个月内,改好日期后,启动Intelij 少一个截 ...
- MVC5+EF6 入门完整教程
MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@20150521 MVC5+EF6 入门完整教程9:多表 ...
- linux6.*无法正常启动has进程解决方案
1. 数据库安装成功之后:发现ohasd进程存在异常:[root@oracle234 ~]# su - grid[grid@oracle234 ~]$ ps -ef| grep ohasdgrid ...