`
javafw
  • 浏览: 13379 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

SUN JVM内存管理

阅读更多

名词解释: 
JVM(Java Virtual Machine):Java虚拟机,所有的Java程序都在Java虚拟机中运行。 
元数据:在本文中指用于描述类和接口定义的数据。 

在我做J2EE系统开发的工作生涯中,经常遇到技术人员或客户发出诸如此类的感慨:我的J2EE应用系统处理的数据量不大,系统体积也不大,技术架构也没有问题,我的应用服务器的内存有4G或8G;系统运行起来很慢,还经常出现内存溢出错误。真是无奈!每次遇到这样的情况,我心中都会忍不住窃笑之。 

其实他们所遇到这种情况,不是技术架构上的问题,不是系统本身的问题,也不是应用服务器的问题,也可能不是服务器的内存资源真的不足的问题。他们花了很多时间在J2EE应用系统本身上找问题(当然一般情况下,这种做法是对的;当出现问题时,在自身上多找找有什么不足),结果还是解决不了问题。他们却忽略了很重要的一点:J2EE应用系统是运行在J2EE应用服务器上的,而J2EE应用服务器又是运行在JVM(Java Virtual Machine)上的。 
其实在生产环境中JVM参数的优化和设置对J2EE应用系统性能有着决定性的作用。本篇我们就来分析JAVA的创建者SUN 公司的JVM的内存管理机制(在现实中绝大多数的应用服务器是运行在SUN公司的JVM上的,当然除了SUN公司的JVM,还有IBM的JVM,Bea的JVM等);下篇咱们具体讲解怎样优化JVM的参数以达到优化J2EE应用的目的。 
咱们先来看JVM的内存管理制吧,JVM的早期版本并没有进行分区管理;这样的后果是JVM进行垃圾回收时,不得不扫描JVM所管理的整片内存,所以搜集垃圾是很耗费资源的事情,也是早期JAVA程序的性能低下的主要原因。随着JVM的发展,JVM引进了分区管理的机制。 
采用分区管理机制的JVM将JVM所管理的所有内存资源分为2个大的部分。永久存储区(Permanent Space)和堆空间(The Heap Space)。其中堆空间又分为新生区(Young (New) generation space)和养老区(Tenure (Old) generation space),新生区又分为伊甸园(Eden space),幸存者0区(Survivor 0 space)和幸存者1区(Survivor 1 space)。具体分区如下图: 



那JVM他的这些分区各有什么用途,请看下面的解说。 

永久存储区(Permanent Space) :永久存储区是JVM的驻留内存,用于存放JDK自身所携带的Class,Interface的元数据,应用服务器允许必须的Class,Interface的元数据和Java程序运行时需要的Class和Interface的元数据。被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM时,释放此区域所控制的内存。 

堆空间(The Heap Space) :是JAVA对象生死存亡的地区,JAVA对象的出生,成长,死亡都在这个区域完成。堆空间又分别按JAVA对象的创建和年龄特征分为养老区和新生区。 

新生区(Young (New) generation space ):新生区的作用包括JAVA对象的创建和从JAVA对象中筛选出能进入养老区的JAVA对象。 

伊甸园(Eden space) :JAVA对空间中的所有对象在此出生,该区的名字因此而得名。也即是说当你的JAVA程序运行时,需要创建新的对象,JVM将在该区为你创建一个指定的对象供程序使用。创建对象的依据即是永久存储区中的元数据。 

幸存者0区(Survivor 0 space)和幸存者1区(Survivor1 space) :当伊甸园的控件用完时,程序又需要创建对象;此时JVM的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象进行销毁工作。同时将伊甸园中的还有其他对象引用的对象移动到幸存者0区。幸存者0区就是用于存放伊甸园垃圾回收时所幸存下来的JAVA对象。当将伊甸园中的还有其他对象引用的对象移动到幸存者0区时,如果幸存者0区也没有空间来存放这些对象时,JVM的垃圾回收器将对幸存者0区进行垃圾回收处理,将幸存者0区中不在有其他对象引用的JAVA对象进行销毁,将幸存者0区中还有其他对象引用的对象移动到幸存者1区。幸存者1区的作用就是用于存放幸存者0区垃圾回收处理所幸存下来的JAVA对象。 

养老区(Tenure (Old) generation space) :用于保存从新生区筛选出来的JAVA对象。 
上面我们看了JVM的内存分区管理,现在我们来看JVM的垃圾回收工作是怎样运作的。首先当启动J2EE应用服务器时,JVM随之启动,并将JDK的类和接口,应用服务器运行时需要的类和接口以及J2EE应用的类和接口定义文件也及编译后的Class文件或JAR包中的Class文件装载到JVM的永久存储区。在伊甸园中创建JVM,应用服务器运行时必须的JAVA对象,创建J2EE应用启动时必须创建的JAVA对象;J2EE应用启动完毕,可对外提供服务。 
JVM在伊甸园区根据用户的每次请求创建相应的JAVA对象,当伊甸园的空间不足以用来创建新JAVA对象的时候,JVM的垃圾回收器执行对伊甸园区的垃圾回收工作,销毁那些不再被其他对象引用的JAVA对象(如果该对象仅仅被一个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并将那些被其他对象所引用的JAVA对象移动到幸存者0区。 
如果幸存者0区有足够控件存放则直接放到幸存者0区;如果幸存者0区没有足够空间存放,则JVM的垃圾回收器执行对幸存者0区的垃圾回收工作,销毁那些不再被其他对象引用的JAVA对象(如果该对象仅仅被一个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并将那些被其他对象所引用的JAVA对象移动到幸存者1区。 
如果幸存者1区有足够控件存放则直接放到幸存者1区;如果幸存者0区没有足够空间存放,则JVM的垃圾回收器执行对幸存者0区的垃圾回收工作,销毁那些不再被其他对象引用的JAVA对象(如果该对象仅仅被一个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并将那些被其他对象所引用的JAVA对象移动到养老区。 
如果养老区有足够控件存放则直接放到养老区;如果养老区没有足够空间存放,则JVM的垃圾回收器执行对养老区区的垃圾回收工作,销毁那些不再被其他对象引用的JAVA对象(如果该对象仅仅被一个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并保留那些被其他对象所引用的JAVA对象。如果到最后养老区,幸存者1区,幸存者0区和伊甸园区都没有空间的话,则JVM会报告“JVM堆空间溢出(java.lang.OutOfMemoryError: Java heap space)”,也即是在堆空间没有空间来创建对象。 
这就是JVM的内存分区管理,相比不分区来说;一般情况下,垃圾回收的速度要快很多;因为在没有必要的时候不用扫描整片内存而节省了大量时间。 
通常大家还会遇到另外一种内存溢出错误“永久存储区溢出(java.lang.OutOfMemoryError: Java Permanent Space)”。


引自: http://cshbbrain.iteye.com/blog/526356

感谢原文作者!


  • 大小: 23.8 KB
分享到:
评论

相关推荐

    Sun JVM原理与内存管理

    ### Sun JVM原理与内存管理 #### 一、Sun JDK 1.6 GC (Garbage Collector) Sun JDK 1.6 的垃圾收集器(GC)是其内存管理的关键组成部分,它负责自动地回收不再使用的对象所占用的内存。本文将详细介绍Sun JDK 1.6 GC...

    JVM内存管理白皮书

    在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...

    JVM深入解析(JVM specification 和Sun的JVM的内存机制)

    - Sun JVM内存管理主要涉及堆和栈的管理,以及对象的分配和回收。 - 堆内存分为新生代(Young Generation)和老年代(Tenured Generation),新生代又分为Eden区和两个Survivor区,用于实现高效的垃圾收集策略,如...

    新手必须学习资料:JVM详解

    SUN JVM 的内存管理机制包括内存分配和垃圾回收两个方面。 * 内存分配:SUN JVM 会根据不同的对象分配不同的内存空间,包括堆和栈两种方式。 * 垃圾回收:SUN JVM 的垃圾回收机制负责回收垃圾对象的内存空间,避免...

    java JVM 详解

    SUN JVM 的内存管理机制主要包括以下几个方面: * 垃圾回收机制:用于回收无用的对象实例和数组,释放内存空间。 * 内存分配机制:用于分配内存空间给对象实例和数组。 SUN JVM 调优 SUN JVM 提供了多种调优机制...

    jvm详解资料

    - **SUN JVM内存管理**:Sun JVM的内存管理主要关注堆(Heap)和非堆内存(Non-Heap Memory)。堆内存用于存储对象实例,而非堆内存则包含方法区和线程栈等,用于存储类元数据和线程状态。 - **SUN JVM调优**:调优...

    JVM详解与学习

    ##### 2.3 Sun JVM内存管理 Sun JVM的内存管理包括以下几个关键部分: - **堆 (Heap)**:用于存储所有类实例和数组的对象。堆是所有线程共享的区域。 - **方法区 (Method Area)**:存储已加载类的信息、常量、静态...

    JVM机制原理详细讲解

    2.3 **SUN JVM内存管理(优化)**:在Sun JVM中,内存分为新生代、老年代和永久代,用于不同生命周期的对象存储。新生代采用复制算法,老年代则用标记-整理或标记-压缩算法,以优化内存回收。 2.4 **SUN JVM调优**...

    JVM详解doc

    ##### 2.3 SUN JVM内存管理(优化) Sun JVM提供了多种内存管理和优化技术,例如: - **Young Generation(新生代)**:用于存储新创建的对象。 - **Old Generation(老年代)**:用于存储长时间存活的对象。 - **Perm...

    jvm详解(java虚拟机详解)

    ##### 2.3 SUN JVM内存管理(优化) Sun JVM的内存管理主要涉及堆(Heap)和方法区(Method Area)的管理,还包括线程栈(Thread Stack)、程序计数器(Program Counter)等。 ##### 2.4 SUN JVM调优 JVM调优通常...

    java JVM详解

    SUN JVM 提供了详细的内存管理机制,旨在优化 Java 应用程序的性能。内存管理的关键部分包括: - **Heap (堆)**:用于存储 Java 对象的实例和数组。 - **Method Area (方法区域)**:存储已加载类的信息、常量、静态...

    JVM内存管理-GC模型-编写GC友好的代码

    JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧

    JVM详解:带书签超清文字版.pdf

    **2.3 SUN JVM内存管理** - **Heap(堆)**:存放所有类实例和数组。 - **Method Area(方法区)**:存放已加载类的信息、常量、静态变量等。 - **Java Stack(Java栈)**:每个线程私有,存储局部变量、操作数栈等...

    JVM详解及调优

    **2.3 Sun JVM内存管理(优化)** - **堆(Heap)**: 用于存放所有Java对象实例和数组的空间。堆是所有线程共享的,因此需要处理好并发访问的问题。 - **方法区域(Method Area)**: 存储每个类的信息、常量池、...

    Java 虚拟机JVM内存模型

    ##### 2.3 SUN/Oracle JVM内存管理及优化 Sun/Oracle JVM的内存管理机制包括垃圾收集、内存分配与回收策略等。优化方面,SUN/Oracle提供了多种优化技术,包括对JVM内存的优化,例如调整新生代和老年代的比例,选择...

    JVM内存管理和垃圾回收.pdf

    Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到...总之,JVM内存管理和垃圾回收是优化Java应用性能的关键。了解这些概念并正确配置JVM参数,可以帮助开发者创建更高效、更稳定的软件系统。

    JVM内存管理面试常见问题全解.doc

    JVM 内存管理面试常见问题全解 JVM 内存管理是 Java 程序员必须掌握的重要知识点,本文将对 JVM 内存管理的面试常见问题进行全解。 一、什么是 JVM Java Virtual Machine(Java 虚拟机)是 Java 程序实现跨平台的...

    JVM内存管理和垃圾回收参考.pdf

    Java虚拟机(JVM)内存管理和...总结来说,JVM内存管理和垃圾回收是一个复杂而精细的过程,涉及多种策略和算法,旨在高效利用内存,减少应用暂停时间,并防止内存泄漏。理解和掌握这些原理对优化Java应用性能至关重要。

    JVM内存管理和垃圾回收知识.pdf

    Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到程序的性能和稳定性。本文主要探讨了JVM如何处理内存分配、垃圾检测与回收,以及各种策略和性能指标。 首先,垃圾回收是JVM的一项核心...

Global site tag (gtag.js) - Google Analytics