//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
>>那么请问栈内存和堆内存应该对应的是硬件中的同一个RAM吧?
是硬件中的同一个RAM,启动一个jvm时向操作系统所申请的那一块内存中,
把其中一部分用于栈,其中一部分用于堆。
>>static变量存储在什么位置呢?
目前的jvm中有两种堆(不排除以后合并为一种堆),
其中一种堆是用于存放由new创建的对象和数组,
另一种堆是用于存放装载进来的类信息,static变量即存储在这个类信息中。
栈内存速度快,堆内存速度慢
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
java 启动设置内存参数:
java -Xms1024m -Xmx2048m ??
还是java -Xms=32m -Xmx=256m ??
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
每个线程都有自己的内存栈(stack),用来存放局部变量和返回值。所有的线程共享一个内存堆(heap),所有运行时的内存分配都在堆上进行,也就是所有对象都在堆上创建。
内存分配方式有三种:
1 从静态存储区域分配.例如static变量。
2 在栈上创建。各种原始数据类型的局部变量。
3 在堆上创建。对象都是在堆上创建的。程序在运行时候用new来创建对象。
***********************************************************************
分代复制垃圾收集器
所有新创建的对象都在一个类似栈的内存区域分配(叫做eden)。当这块内存分配完,其中大部分对象已经死亡了。垃圾收集器只要把少数未死亡的长期对象复制到另一块内存,然后直接更新eden的指针就可以了,这些未死亡的对象称未tenured对象。eden中的对象称为young generation,生命较长的对象生存的区域称未old generation.当old generation的内存区域全部分配完,垃圾收集器会进行一次主要垃圾收集(major collection)。主要垃圾收集通常比次要垃圾收集慢,因为所有存活的对象都会被遍历到。
标记垃圾收集器
在年老代中,通常使用标记垃圾收集器,这种垃圾收集器会从一组根引用开始,遍历所有的对象,如果一个对象被根引用,那么就标记未存活,而存活对象引用的对象也标记为存活,如此循环,其他的对象则被标记为死亡。死亡的对象的内存被回收。
分两类:
标记紧缩垃圾收集器 将所有存活的对象复制到一个连续的内存区域,减少内存碎片。
标记清除垃圾收集器 保留所有存活的对象,而将所有死亡对象的内存空间记录到一个自由空间列表中。
增量垃圾收集器
增量垃圾收集器的基本原理是时间较长的年老代的垃圾收集分成许多较短的时间间隔来完成。每次只回收一部分内存。对于用户来说好像没有停顿一样(垃圾收集器在运行地时候,会停止JVM中地其他程序的线程程序)。但是增量垃圾收集器不精确地保证停顿地时间。
建议:尽量创建更少的对象,如使用StringBuffer代替String.
建议:JAVA中的null可以告诉垃圾收集器回收内存。
从JDK1.2开始,为了能更加精确地控制垃圾收集器,java引入了Reference类型。有strong,soft,weak和phantom类型的引用。weak,在内存不足时可以自动地被回收。
******************************************************************************
强可达状态
一个新创建的对象即处于强可达状态。在程序运行一段时间后,如果创建该对象的线程无需通过任何引用类型的对象就可以访问该对象,则该对象也处于强可达状态。
软可达状态
当对象不处于强可达的状态,并且可以通过软引用进行访问时,即处于软可达状态。在程序申请内存时,垃圾收集器会自行判断是否回收处于软可达状态的对象。如果决定回收该对象,那么垃圾收集器会清除所有指向该对象的软引用。如果任何其他处于软可达状态的对象可以通过强引用访问该对象,那么指向这些对象的软引用也会被清除。
垃圾收集器在决定那些软可达状态的对象被回收时,采用的是“最久未使用”原则。
创建一个软引用代码:
SoftReference wRef = new SoftReference(ref);
也可以将软引用登记在一个引用队列中:
Reference aQueue = new ReferenceQueue();
SoftReference sRef = new SoftReference(new SomeObject(),aQueue);
弱可达状态
当对象既不处于强可达,也不处于软可达的状态,但可以通过弱引用进行访问,即处于弱可达状态。弱可达状态比软可达状态更弱一些。垃圾收集器会一起清除所有的弱引用,而不是像对软引用那样提供一个缓冲的空间。
幻可达状态
如果一个对象不是强可达,软可达和弱可达中的任何一种状态,其finalize()方法已经被执行过,并且被幻引用指向,那么该对象处于幻可达状态。
与软引用和弱引用不同,不能直接创建一个幻引用,而必须通过像引用队列登记的途径来创建它。
RefereceQueue aQueue = new ReferenceQueue();
PhantomReference sRef = new PhantomReference(new SomeObject(),aQueue);
*************************************************************************************
内存泄漏的根源
第一种 几种特定的模式下,JAVA特别容易出现内存泄漏。
第二种 与Listener模式有关。如果在集合中增加了一个Listener,却没有在不需要的时候删除,结果就可能引起内存泄漏。因为集合会一直保持对Listener的引用,因此Listener不会被回收掉。
第三种情况与数据结构有关。由于大部分数据结构以某种类型的集合来存储数据,当这些数据结构生命很长,实现又不恰当,就会产生内存泄漏。
public Object pop(){
if(top = -1)
throws new EmptyStackException();
Object temp = stack[top];
stack[top] = null;//缺少则内存泄漏
top--;
return temp;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cugwei/archive/2006/01/09/574796.aspx
分享到:
相关推荐
资源名称:Java内存管理机制相关资料汇总资源目录:【】java内存回收机制及预防【】java内存管理机制【】java内存管理白皮书【】Java虚拟机内存管理_对象和引用_空指针【】深入理解java虚拟机jvm高级行与最佳实践...
通过对Java内存管理机制的深入分析,我们可以了解到Java如何高效地管理和利用内存资源。理解这些机制对于优化Java应用程序的性能至关重要,特别是在处理大规模数据集或多线程环境时。此外,合理配置JVM参数和选择...
Java内存管理是Java编程中的核心概念,它涉及到程序运行时数据的存储、分配以及回收。在Java中,内存主要分为堆内存(Heap)和栈内存(Stack),还有方法区(Method Area)、程序计数器(PC Register)以及本地方法...
Java内存管理是Java编程中至关重要的一环,它与C++等其他语言的内存管理机制有着显著的区别。在C++中,程序员需要手动管理内存,包括分配和释放,而在Java中,这一过程则由Java虚拟机(JVM)自动进行,通过垃圾收集...
Java内存管理是Java核心技术的重要组成部分,对于每个开发者来说,理解其工作原理都是十分必要的。这一主题既实用又有趣。以下是对Java内存管理的精彩概述,主要基于Sun Hotspot JVM,但请注意,不同JVM可能有不同的...
在Windows操作系统中,内存管理是一个非常重要的方面。Windows实现按需调页的虚拟内存机制,使得应用程序可以使用超过物理内存容量的虚拟内存。此外,Windows还使用了页面文件来扩展物理内存的容量。 在Java中,...
为了优化内存管理,Java采用了垃圾回收机制(Garbage Collection),自动回收不再使用的对象,以避免内存泄漏。 2. **Method Area(方法区)**:又称为非堆区或永久代,在这里存储的是类和接口的元数据,包括类的...
Java内存管理是Java编程中的核心概念,它涉及到程序运行时如何高效地分配、使用和回收内存。在Java中,内存管理主要由JVM(Java Virtual Machine)负责,其中包括了垃圾收集机制,确保程序不会因为内存泄漏而导致...
Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...
Java内存管理是Java编程中至关重要的一环,它涉及到程序的性能和稳定性。本文将深入探讨Java内存管理机制,包括垃圾回收、内存分配与释放、内存泄漏及其预防措施,以及四种引用类型的特点和应用场景。 首先,Java...
内存管理简介 内存管理的职责为分配内存,回收内存。 没有自动内存管理的语言/平台容易发生错误。 典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。 另一个...
Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...
### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...
"JAVA内存管理模式研究" 在 Java 编程语言中,内存管理是非常关键的机制之一。 Java 虚拟机(JVM)通过对内存的分配和回收来管理内存资源。 本文将详细介绍 Java 的内存管理模式,包括内存区域、内存分配策略、垃圾...
Java 中的内存管理机制是自动的,开发者不需要手动释放内存,但是这也使得 Java 程序占用内存相对较高。为了避免内存泄露,开发者需要注意在编写程序时,合理地使用内存资源。 Java 内存原理的优点: * 自动内存...
本文旨在深入探讨Java内存管理的各个方面,特别是针对HotSpot虚拟机的内存管理策略和机制。 首先,Java虚拟机内存管理机制的核心是垃圾收集(Garbage Collection, GC),它能够自动识别不再被引用的对象,并释放...
【JAVA 内存管理总结】 Java 的内存管理主要涉及对象的生命周期,包括对象的分配和释放。对象的分配主要是通过 `new` 关键字在堆内存(Heap)中完成,而对象的释放则由垃圾回收机制(Garbage Collector, GC)自动...