Java GC简介
• 所有Java对象都是分配在Java堆上面的;
• Java上使用垃圾回收机制回收没有引用到的对象;
• Java虚拟机有专门的GC线程用来执行垃圾回收;
• 当GC线程从内存删除一个对象时,首先会调用对象的finalize函数,在这个函数里可以执行自定义
的释放资源操作;
• Java程序自身无法强制启动GC,即使使用System.gc()和Runtime.gc()这样的函数,也只是递交一
个GC请求给GC线程;
• 当无法在Java内存堆(Java heap)上创建对象时,Java虚拟机会抛出OutOfMemoryError。
• 对象没有被其他对象引用,是指从GC Root开始遍历,无法遍历到的对象,GC Root包括:
• Class – 系统里加载的类,这些类不会被卸载,类里的静态变量可能会引用其它Java对象。
• Thread – 正在运行的线程。
• 堆栈上的局部变量 – 堆栈上的函数还要运行,因此他们引用到的对象都是有用的。
• JNI参数和局部变量。
• 锁(Monitor) - 用于线程同步。
Java GC堆结构
•Java堆分成3个部分,或称作届(generation),分别是Young(New) generation, Tenured(Old)
generation,Perm Area of heap。而New generation又细分成Eden space, Survivor 1和Survivor
2。新的对象总是先在Eden space上创建,经过minor GC后,剩余的会挪到Survivor 1,接着就是
Survivor 2。当执行过Major GC后,对象会被挪到Old generation中。
•Perm area主要是用来保存Java类型以及函数的元数据信息,有的内在化(internalization)的字
符串也会放在里面。
Java GC器
•虚拟机提供了好几个GC收集器,Java 5在Serial GC之外,还添加了几个GC收集器:
•Serial GC:只使用一个GC线程执行垃圾回收工作,在执行GC时,其他线程都会暂停工
作,收集young generation里的垃圾对象。
•Parallel (Throughput) GC:使用多个GC线程并行执行垃圾回收工作,在执行GC时,
其他线程都会暂停工作,收集young generation里的垃圾对象。
•Concurrent Mark Sweep(CMS) GC:用于收集old generation里的垃圾对象,跟其他
线程并行工作,当需要标注某个线程里的垃圾对象时,会暂停线程一小会,其他时候可
以与线程并行执行。
•在GC时,通常young generation里的GC,即minor GC很快,当old generation空间不够
时,Java虚拟机首先会尝试CMS GC并行收集,如果这样空间还不能快速回收时,那Java
虚拟机会暂停所有线程执行GC,这个时候称为Full GC。一般来说,Full GC的执行效率
要比minor GC慢很多,程序优化的目标也是尽量减少Full GC的执行次数。
Java 内存堆
•Java虚拟机在启动时,会从操作系统申请一大块内存,后续
Java程序运行时,所有对象都在这个内存块里分配,这个内存块
叫Java Heap。
•Java内存堆在Java程序启动后无法更改,只能通过修改Java程
序的-Xms、–Xmx、-Xmn等启动参数改变设置。当Java堆内存用
光,而且GC也无法收集更多的内存时,抛出OutOfMemoryError。
•可以使用Jconsole、Runtime.maxMemory()、
Runtime.totalMemory()以及Runtime.freeMemory()等函数查询
Java程序的内存堆设置。
java内存调优
最新推荐文章于 2024-11-01 14:48:20 发布