1、Java的内存管理就是对象的分配和释放问题。
在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。
对象的释放是由GC决定和执行的。
在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法简化了程序员的工作。但也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。
GC释放空间方法:
监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。当该对象不再被引用时,释放对象。
2、内存管理结构
Java使用有向图的方式进行内存管理,对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。
将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从
main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个
对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。
3、使用有向图方式管理内存的优缺点
Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。
这种方式的优点是管理内存的精度很高,但是效率较低。
另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。
★ Java的内存泄露
Java虽然由GC来回收内存,但也是存在泄露问题的,只是比C++小一点。
1、与C++的比较
c++所有对象的分配和回收都需要由用户来管理。即需要管理点,也需要管理边。若存在不可达的点,无法在回收分配给那个点的内存,导致内存泄露。存在无用的对象引用,自然也会导致内存泄露。
Java由GC来管理内存回收,GC将回收不可达的对象占用的内存空间。所以,Java需要考虑的内存泄露问题主要是那些被引用但无用的对象——即指要管理边就可以。被引用但无用的对象,程序引用了该对象,但后续不会再使用它。它占用的内存空间就浪费了。
如果存在对象的引用,这个对象就被定义为“活动的”,同时不会被释放。
2、Java内存泄露处理
处理Java的内存泄露问题:确认该对象不再会被使用。
典型的做法——
把对象数据成员设为null
从集合中移除该对象
注意,当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。
例子:
-
<span style=
"font-size:16px;"
>List myList=
new
ArrayList();
-
for
(
int
i=
1
;i<
100
; i++)
-
{
-
Object o=new
Object();
-
myList.add(o);
-
o=null
;
-
}
-
-
</span>
当myList后来不再用到,将之设为null,释放所有它引用的对象。之后GC便会回收这些对象占用的内存。
★ 对GC操作
对GC的操作并不一定能达到管理内存的效果。
GC对于程序员来说基本是透明的,不可见的。我们只有几个函数可以访问GC,例如运行GC的函数System.gc(),System.。
但是根据Java语言规范定义, System.gc()函数不保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低。
JVM调用GC的策略有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC。但通常来
说,我们不需要关心这些。除非在一些特定的场合,GC的执行影响应用程序的性能,例如对于基于Web的实时系统,如网络游戏等,用户不希望GC突然中断应
用程序执行而进行垃圾回收,那么我们需要调整GC的参数,让GC能够通过平缓的方式释放内存,例如将垃圾回收分解为一系列的小步骤执行,Sun提供的
HotSpot JVM就支持这一特性。
★ 内存泄露检测
市场上已有几种专业检查Java内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测Java程序运行时,所有对象的申请、释放等动作,将内存管理
的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括Optimizeit
Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等。
在运行过程中,我们可以随时观察内存的使用情况,通过这种方式,我们可以很快找到那些长期不被释放,并且不再使用的对象。我们通过检查这些对象的生存周期,确认其是否为内存泄露。
★ 软引用
特点:只有当内存不够的时候才回收这类内存,同时又保证在Java抛出OutOfMemory异常之前,被设置为null。
保证最大限度的使用内存而不引起OutOfMemory异常。
在某些时候对软引用的使用会降低应用的运行效率与性能,例如:应用软引用的对象的初始化过程较为耗时,或者对象的状态在程序的运行过程中发生了变化,都会给重新创建对象与初始化对象带来不同程度的麻烦。
用途:
可以用于实现一些常用资源的缓存,实现Cache的功能
处理一些占用内存大而且声明周期较长,但使用并不频繁的对象时应尽量应用该技术
★ java程序设计中有关内存管理的经验
1.最基本的建议是尽早释放无用对象的引用。如:
-
<span style=
"font-size:16px;"
>...
-
A a = new
A();
-
-
a = null
;
-
….</span>
注:如果a 是方法的返回值,不要做这样的处理,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现、排除
2.尽量少用finalize函数。它会加大GC的工作量。
3.如果需要使用经常用到的图片,可以使用soft应用类型。它尽可能把图片保存在内存中
4.注意集合数据类型,包括数组、树、图、链表等数据结构,这些数据结构对GC来说,回收更为复杂。
5.尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费
6.尽量避免强制系统做垃圾内存的回收,增长系统做垃圾回收的最终时间
7.尽量避免显式申请数组空间
8.尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。
9.尽量在合适的场景下使用对象池技术以提高系统性能。
相关推荐
【标签】:优化内存,Java内存管理,Java堆,对象创建,集合效率 【正文】: Java应用程序的内存管理是一个复杂且关键的主题,尤其是在高并发和大数据量的场景下。Java运行时环境(JVM)为开发者提供了自动内存管理...
为了优化内存管理,Java采用了垃圾回收机制(Garbage Collection),自动回收不再使用的对象,以避免内存泄漏。 2. **Method Area(方法区)**:又称为非堆区或永久代,在这里存储的是类和接口的元数据,包括类的...
Java内存管理是Java编程中至关重要的一环,它涉及到程序的性能和稳定性。本文将深入探讨Java内存管理机制,包括垃圾回收、内存分配与释放、内存泄漏及其预防措施,以及四种引用类型的特点和应用场景。 首先,Java...
### Java内存管理概述 在Java 2平台标准版(J2SE)中,自动内存管理是其核心优势之一。这使得开发人员免于处理复杂的显式内存管理问题。本文档旨在提供一个关于Java HotSpot虚拟机(JVM)内存管理的全面概览,特别...
在这个实验中,我们将使用Java编程语言来实现内存管理的模拟,这为学习者提供了一个直观的实践平台,以便更好地理解抽象的内存分配和回收机制。 内存管理是操作系统的关键任务之一,它涉及如何有效地分配、使用和...
根据应用程序的特性,可以通过调整JVM参数来优化内存管理,如设置堆大小(`-Xms`和`-Xmx`)、新生代和老年代的比例(`-XX:NewRatio`)、垃圾收集器类型等。 7. **工具** 为了监控和分析Java内存管理,我们可以...
本文将深入探讨Java中堆内存与栈内存的分配机制,并通过对比分析它们之间的差异,帮助读者更好地掌握Java内存管理的核心概念。 #### 二、堆内存与栈内存概述 ##### 1. 堆内存 堆内存是Java虚拟机(JVM)用于存储...
java内存机制与启动参数优化 Java 内存机制是指 Java 虚拟机(JVM)管理内存的机制。JVM 主要管理两种类型的内存:堆(Heap)和非堆(Perm)。堆是 Java 代码使用的内存,留给开发人员使用的;非堆是 JVM 留给自己...
内容概要:本文全面解析了Java应用程序中的内存管理与优化方法。首先介绍了内存泄漏、内存抖动的基础概念,然后讲解了垃圾回收(GC)的基本原理及其工作流程。文章列举了多种常见的内存泄漏场景及其产生的原因,如非...
Java作为一种广泛使用的编程语言,其内存管理机制一直是开发者关注的重点之一。Java程序在运行时如何分配内存?对象是如何存储的?这些问题不仅对于深入理解Java虚拟机(JVM)的工作原理至关重要,同时也直接影响到...
为了评估垃圾收集器的性能,本文列举了几个常用的工具,例如jmap、jstat、HPROF等,它们能够帮助开发者进行堆分析,监控垃圾收集过程,从而更好地理解和优化内存管理。 在最后,文章还列出了一系列用于控制垃圾收集...
总结来说,面对Java IBM WebSphere的内存溢出问题,我们需要结合`javacore`和`deapdump`等诊断工具,通过分析脚本和相关库文件,理解内存管理原理,调整JVM配置,并优化代码,才能有效地排查和解决问题。
【JAVA 内存管理总结】 Java 的内存管理主要涉及对象的生命周期,包括对象的分配和释放。对象的分配主要是通过 `new` 关键字在堆内存(Heap)中完成,而对象的释放则由垃圾回收机制(Garbage Collector, GC)自动...
Java作为一种广泛使用的编程语言,其内存管理机制是理解程序行为的关键。本文将深入探讨Java中的两种主要内存区域:堆内存(Heap Memory)和栈内存(Stack Memory)。这两种内存分别承担着不同的角色,对于程序员...
Java内存管理是一个关键的议题,...总的来说,理解Java内存管理和垃圾收集机制,以及如何使用工具进行分析和定位,是优化Java应用程序性能、避免内存泄漏的关键。通过有效的内存管理,可以确保程序高效且稳定地运行。
C++内存管理是编程领域中的一个关键话题,尤其...与其他如Java或.NET平台相比,C++的内存管理虽然需要更多手动工作,但也提供了更多底层控制的可能性。对于追求性能和低级优化的开发者来说,这是一个无法忽视的领域。
根据对象大小选择合适的缓存策略,比如LRU(最近最少使用)、LFU(最不经常使用)等,可以优化内存利用率和缓存命中率。此外,合理设计对象结构,避免内存浪费,如减少不必要的引用,使用紧凑的数据结构,也可以降低...
JVM的内存管理包括堆内存、栈内存和方法区,其中垃圾回收机制对性能影响显著。优化时应关注对象的生命周期,减少短生命周期对象在老年代的存在,以降低垃圾回收频率。 其次,关注代码层面的优化。避免过度使用反射...
### 高性能JAVA开发之内存管理 在Java开发过程中,内存管理是确保程序高效稳定运行的关键环节之一。本文将深入探讨Java对象的生命周期,并通过具体的示例代码来解析不同阶段的特点及其对内存管理的影响。 #### ...