- 浏览: 16619 次
- 性别:
- 来自: 上海
文章分类
最新评论
内存泄漏(memory leak):该被回收的对象没有被回收,或者说没有被及时回收,导致了废弃对象依然占用着空间,一方面内存泄漏的问题具有常发性,一旦会发生一次就会发生100次,直接导致程序的运行性能,甚至出现OOM
咱们看例子
再来看一下调用地方
大家有没有发现,上述的stack中会出现内存泄漏呢?内存泄漏很隐蔽,在上述代码中确实不好找出来,因为在调用的时候,我们可以很明显看到,在main方法执行过程中,执行完成后,不会有什么异常出现,很正常的一个程序,在stack对象push然后再pop后,其中的Object 数组中的对象被一个个的pop出去,对于stack而已已经是一个个废弃对象了,不需要再使用到,但是数组还保持着对他的引用,无法被回收,这时应将这些pop出去的对象进行置空,让其真正被“废弃”
修改代码如下
参考书籍《Effective Java》
咱们看例子
public class Stack { private Object[] objects; private int size; private int STACK_LEN = 16; public Stack(){ objects = new Object[STACK_LEN]; } public void push(Object object){ ensureCapacity(); objects[size++] = object; } public Object pop(){ if(size == 0){ throw new EmptyStackException(); } return objects[--size]; } public void ensureCapacity(){ if(objects.length == size){ objects = Arrays.copyOf(objects,2*size+1); } } }
再来看一下调用地方
public static void main(String[] args){ Stack stack = new Stack(); for(int i = 0;i<20;i++){ stack.push(new Object()); } for(int i = 0;i<20;i++){ stack.pop(); } }
大家有没有发现,上述的stack中会出现内存泄漏呢?内存泄漏很隐蔽,在上述代码中确实不好找出来,因为在调用的时候,我们可以很明显看到,在main方法执行过程中,执行完成后,不会有什么异常出现,很正常的一个程序,在stack对象push然后再pop后,其中的Object 数组中的对象被一个个的pop出去,对于stack而已已经是一个个废弃对象了,不需要再使用到,但是数组还保持着对他的引用,无法被回收,这时应将这些pop出去的对象进行置空,让其真正被“废弃”
修改代码如下
public Object pop(){ if(size == 0){ throw new EmptyStackException(); } Object res = objects[--size]; objects[size] =null; return res; }
参考书籍《Effective Java》
发表评论
-
知识点
2017-11-13 18:16 0happen befor: 线程 star before 线程 ... -
ConcurrentHashMap 精髓
2017-11-02 15:13 0ConcurrentHashMap 精髓: 1.s ... -
经典面试题
2017-09-28 16:58 676接触到一个经典的面试 ... -
java condition await() 与object wait()的区别
2017-09-07 14:42 2775java condition await() 与object ... -
一致性HASH
2016-11-10 15:54 0在我们做分布式的时候,难免会有一个路由的过程,比如说redis ... -
JVM stop the world
2016-11-09 23:03 452JVM 在进行GC的时候,需要做两个事情,一个是GC root ... -
java Thread 解析
2016-10-27 21:31 0/* * Copyright (c) 1994, 20 ... -
悲观锁 乐观锁,公平锁,非公平锁
2016-10-27 13:55 0悲观锁 乐观锁,公平锁,非公平锁 d 他们的区别 悲观锁与乐 ... -
java LockSupport
2016-10-26 20:33 0/* * ORACLE PROPRIETARY/CONFI ... -
AbstractQueuedSynchronizer 的 CLH
2016-10-26 09:19 0/** * Wait queue node ... -
java 中的wait 与 await
2016-10-25 20:16 0java中wait() 与 await() wait() 方 ... -
线程性能与可伸缩性
2016-08-25 23:06 0对性能的思考 性能与可伸缩性 评估各种性能的权衡因素 am ... -
怎么平衡线程并发中的活跃性和安全性
2016-08-25 23:02 0线程的活跃性 活跃性:线程的处理速度 安全性:加锁保证数据的正 ... -
java线程的取消和关闭
2016-08-25 22:55 0java的线程取消和关闭 在正常的业务操作中,碰到进行中的任 ... -
Java 线程池
2016-08-25 09:24 0线程池工作原理 线程池的原理解析 线程池代码解析 -
研发分级
2016-07-27 11:54 0研发分级 今天老大问了一个问题:怎么区分 -
java并发详解
2016-08-31 07:34 585线程安全 1.什么是并发? 2.什么是线程安全 3.如何保证线 ... -
编程建议(持续更新)
2016-07-18 11:01 3751.UML的重要性,推荐plant ... -
java学习路线图
2016-07-14 22:56 671这么长的时间,么有好好总结过自己的学习路线,今天和大家一起分享 ... -
threadLocal的使用场景--事务下的日志记录
2016-07-02 16:04 2867threadLocal在系统中的使 ...
相关推荐
在Java中,引入了垃圾回收机制:垃圾回收器(Garbage Collector, GC),可以自动回收内存中的垃圾,这是Java语言相对于其它语言的优势,但是内存泄漏并不会因此而完全避免。 垃圾回收器的工作机制是,当一个对象...
### Java中内存泄露及垃圾回收机制 #### 一、内存泄露概述 在计算机科学领域,内存泄露是指在程序运行过程中,不再使用的内存未被及时释放,导致这部分内存无法被重复利用,进而影响程序性能甚至导致程序崩溃的...
### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...
Java内存管理的核心是对象的生命周期,所有对象都在堆内存中分配。当一个对象不再被任何引用所指向,即成为无用对象时,理论上它应该被GC回收。GC通过建立一个有向图来跟踪对象的引用关系,其中根节点通常是程序的主...
如果DLL中分配了内存但未正确释放,或者Java和DLL之间对对象的引用处理不当,都可能导致内存泄露,使得Java进程的内存占用持续增长,影响系统性能。 描述中的“NULL”可能是博主在描述问题时的简化表示,通常在编程...
关于Java中内存泄露问题的研究
Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...
本文将深入探讨Java内存泄露的原因、表现形式以及预防措施。 #### 二、Java内存回收机制 Java的内存管理机制主要依赖于垃圾回收器(Garbage Collection, GC),这是一种自动化的内存管理方式。当对象不再被引用时,...
Java内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。为了有效地诊断和解决这类问题,开发者需要借助特定的分析工具。本篇将详细探讨Java内存泄漏及其相关的分析工具。 内存泄漏是指...
### Java内存泄漏解决方案详解 #### 一、Java内存泄漏概述 在Java开发过程中,经常会遇到内存泄漏的问题,尤其是在长时间运行的应用程序中更为常见。本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地...
在Java中,由于具备垃圾回收机制(GC),理论上开发者不必担心内存泄露问题。然而,在实际应用中,仍然存在一些特殊情况会导致内存泄露的发生。 #### 二、内存泄露的原因分析 1. **未及时关闭资源**:例如文件句柄、...
Java内存管理是一个关键的议题,尤其对于开发大型和长期运行的应用程序来说,内存泄漏可能导致性能下降,甚至引发严重的系统故障。内存泄漏通常发生在程序错误地管理内存,导致某些不再使用的对象无法被垃圾收集器...
Java内存泄漏问题追踪 在Java编程中,内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,随着时间推移,系统可用内存逐渐...
Java内存泄漏分析是一个关键的系统优化任务,尤其是在大型企业级应用中,长期运行的系统可能会因为内存泄漏导致性能下降甚至服务中断。"JAVA内存泄漏分析工具"正是一款用于解决此类问题的专业工具,它能帮助开发者...
### Java内存泄漏详解 #### JVM内存管理概览 在探讨Java内存泄漏之前,我们先简要回顾一下JVM(Java虚拟机)的基本架构及其内存管理机制。这有助于更好地理解内存泄漏的发生原因及其解决方法。 ##### 类装载子...
本文将深入探讨Java内存分析和内存泄露问题。 首先,我们需要了解Java内存模型的基础。Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area)。堆用于存储对象实例,栈用于存储方法调用及局部...
本文将详细介绍如何使用JMAP工具来定位Java代码中的内存泄漏问题。 首先,理解内存泄漏的概念:内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能并不明显,但随着时间的推移,这些未...
与C++等语言不同,Java程序员不需要显式地释放内存,这大大减少了内存泄漏的可能性。 垃圾回收器通过一系列算法来判断哪些对象不再被程序使用。主要有以下几种判断标准: 1. 引用计数法:每个对象都有一个引用计数...
4. Native内存泄漏:Java应用可能使用JNI(Java Native Interface)与C/C++代码交互,若C/C++部分存在内存泄漏,也会间接导致Java内存泄漏。 解决内存泄漏的方法主要包括: 1. 使用工具监控:通过工具如VisualVM、...