首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

《分布式JAVA使用 基础与实践》 第三章 3.2 JVM内存管理(一)

2012-12-28 
《分布式JAVA应用 基础与实践》 第三章 3.2 JVM内存管理(一)3.2? JVM内存管理Java不需要开发人员来显式分配

《分布式JAVA应用 基础与实践》 第三章 3.2 JVM内存管理(一)

3.2? JVM内存管理

Java不需要开发人员来显式分配内存和回收内存,而是由JVM来自动管理内存的分配及回收(又称为垃圾回收、Garbage Collection或GC),这对开发人员来说确实大大降低了编写程序的难度,但副作用可能是在不知不觉中浪费了很多内存,导致JVM花费很多时间进行内存的回收。另外还可能会带来的副作用是由于不清楚JVM内存的分配和回收机制,造成内存泄露,最终导致JVM内存不够用。因此对于Java开发人员而言,不能因为JVM自动内存管理就不掌握内存分配和回收的知识了。

除了内存的分配及回收外,还须掌握跟踪分析JVM内存的使用状况,以便更加准确地判断程序的运行状况及进行性能的调优。

3.2.1? 内存空间

Sun JDK在实现时遵照JVM规范,将内存空间划分为方法区、堆、本地方法栈、PC寄存器及JVM方法栈,如图3.7所示。

??

?

?

Java对象所占用的内存主要从堆上进行分配,堆是所有线程共享的,因此在堆上分配内存时需要进行加锁,这导致了创建对象开销比较大。当堆上空间不足时,会触发GC,如果GC后空间仍然不足,则抛出OutOfMemory错误信息。

Sun JDK为了提升内存分配的效率,会为每个新创建的线程在新生代的Eden Space上分配一块独立的空间,这块空间称为TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行情况计算而得,可通过-XX:TLABWasteTargetPercent来设置TLAB可占用的Eden Space的百分比,默认值为1%。JVM将根据这个比率、线程数量及线程是否频繁分配对象来给每个线程分配合适大小的TLAB空间 。在TLAB上分配内存时不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配,如果对象过大或TLAB空间已用完,则仍然在堆上进行分配。因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效,可通过在启动参数上增加-XX:+PrintTLAB来查看TLAB空间的使用情况 。

在分配细节上取决于GC的实现,后续GC的实现章节会继续介绍。

除了从堆上分配及从TLAB上分配外,还有一种是基于逃逸分析直接在栈上进行分配的方式,此方式已在前文中提及。

?

热点排行