Java 内存管理机制详解

0 下载量 53 浏览量 更新于2024-09-01 收藏 125KB PDF 举报
"JAVA内存管理总结" Java内存管理是对象的分配和释放问题。Java的内存管理可以分为两部分:内存的分配和释放。 **内存的分配** 在Java中,内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。例如,在创建一个新的对象时,需要使用new关键字来申请内存空间,如`String str = new String("hello");`。在这里,str是一个指向String对象的引用,指向一个堆中的对象。 **内存的释放** 对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作。但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。 **什么是Java中的内存泄露** 在Java中,内存泄漏是存在一些被分配的对象,这些对象有两个特点:首先,这些对象是可达的,即在有向图中,存在通路可以与其相连(也是说仍存在该内存对象的引用);其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。 **JVM的内存区域组成** Java把内存分为两种:一种是栈内存,另一种是堆内存。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;堆内存用来存放由new创建的对象和数组以及对象的实例变量。在函数(代码块)中定义一个变量时,Java在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由Java虚拟机的自动垃圾回收器来管理。 **堆和栈的优缺点** 堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点是要在运行时动态分配内存,存取速度较慢;栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。另外,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 **Java中数据在内存中是如何存储的** Java的基本数据类型共有8种,即int,short,long,byte,float,double,boolean,char(注意,并没有string的基本类型)。这种类型的定义是通过诸如`inta=3;`长`b=255L;`的形式来定义的。如`inta=3;`这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值定义在某个程序块)。