//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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内存管理精彩概述
1、JAVA 内存管理总结 2、Java的内存管理实例 3、垃圾回收机制:
Java的内存管理机制分析 让你了解java的内存管理 以及如何去分析它
java 内存管理 详细介绍了java内存管理各个方面的内容
本文档主要讲述的是java内存管理详细介绍;对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象...
在Windows操作系统中,内存管理是一个非常重要的方面。Windows实现按需调页的虚拟内存机制,使得应用程序可以使用超过物理内存容量的虚拟内存。此外,Windows还使用了页面文件来扩展物理内存的容量。 在Java中,...
java内存结构,垃圾收集,并发收集,虚拟机参数
内存管理简介 内存管理的职责为分配内存,回收内存。 没有自动内存管理的语言/平台容易发生错误。 典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。 另一个...
JAVA 内存管理总结 1. java是如何管理内存的 2. 什么叫java的内存泄露 3. JVM的内存区域组成 4.Java中数据在内存中是如何存储的 5. Java的内存管理实例
java内存管理
One strength of the Java™ 2 Platform, Standard Edition (J2SE™) is that it performs automatic memory management, thereby shielding the developer from the complexity of explicit memory management.
主要关于java虚拟机的运行时数据区域,参考了周志明的深入理解java虚拟机,还涉及到了native方法、垃圾回收机制等等。
使用java来实现模拟的内存管理 有分配内存 回收内存等功能 有可视化效果 可以很清楚的看到内存的分配情况
Java内存管理呕心沥血总结出来的,希望对武林中人有一定帮助。
有关java内存泄露的详细资料,Java与C语言的内存管理模型,内存泄漏方式
主要描述java的内存管理机制、释放条件,及内存泄漏的几种可能,四种引用内存的方式各自的优缺点。对很多人来说java的内存管理不再只是个黑盒子
java内存管理深入讲解 基本是理解java程序内存的直接能用的资料了