作者:Jason S.H.Chen
名词解释:
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区;如果幸存者1区没有足够空间存放,则JVM的垃圾回收器执行对幸存者1区的垃圾回收工作,销毁那些不再被其他对象引用的JAVA对象(如果该对象仅仅被一个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并将那些被其他对象所引用的JAVA对象移动到养老区。
如果养老区有足够控件存放则直接放到养老区;如果养老区没有足够空间存放,则JVM的垃圾回收器执行对养老区区的垃圾回收工作,销毁那些不再被其他对象引用的JAVA对象(如果该对象仅仅被一个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并保留那些被其他对象所引用的JAVA对象。如果到最后养老区,幸存者1区,幸存者0区和伊甸园区都没有空间的话,则JVM会报告“JVM堆空间溢出(java.lang.OutOfMemoryError: Java heap space)”,也即是在堆空间没有空间来创建对象。
这就是JVM的内存分区管理,相比不分区来说;一般情况下,垃圾回收的速度要快很多;因为在没有必要的时候不用扫描整片内存而节省了大量时间。
通常大家还会遇到另外一种内存溢出错误“永久存储区溢出(java.lang.OutOfMemoryError: Java Permanent Space)”。
好,本篇对SUN 的JVM内存管理机制讲解就到此为止,下一篇我们将详细讲解怎样优化SUN 的JVM让我们的J2EE系统运行更快,不出现内存溢出等问题。
- 大小: 44.4 KB
分享到:
相关推荐
在IT领域,特别是Web应用服务器管理中,正确配置Java虚拟机(JVM)的内存大小对于确保应用程序的稳定性和性能至关重要。本文将详细探讨如何在Tomcat服务器上配置JVM内存,包括其背景、配置方法以及最佳实践。 #### ...
### 设置JVM内存的方法 ...通过对不同场景下的JVM内存配置方法进行了解和实践,可以有效地优化Java应用程序的表现,确保其稳定运行。此外,根据项目的实际需求灵活调整内存参数,也是提升开发效率的重要手段之一。
- **IBM Java虚拟机**:与Sun JDK兼容,但启动参数的写法风格有所不同,主要用于WebSphere等运行在AIX上的中间件服务器。 - **开源Java虚拟机**:尽管与Sun JDK兼容,但在生产环境中使用较少。 #### 二、Java内存...
- **参数调优**: 根据应用的特点调整JVM启动参数,例如增大或减小堆内存大小、选择合适的垃圾回收器。 - **代码审查**: 定期进行代码审查,识别和消除可能导致性能瓶颈的代码。 - **监控与分析**: 使用工具对运行时...
《Sun JDK 1.6内存管理--调优篇》深入探讨了Java开发中的关键环节——JVM内存管理和性能优化。Sun JDK 1.6作为早期的Java开发环境,其内存管理机制对于理解现代JVM的工作原理至关重要。本文将详细解析JVM内存结构,...
Oracle通过收购Sun和BEA,将Jrockit和Hotspot JDK整合到了一起,提供了-client和-server两种启动选项,分别适用于GUI应用程序和服务器端的企业级应用。 在JVM优化中,内存配置是关键的一环。例如,`-Xms2048m -Xmx...
在WebLogic服务器运行过程中,如果JVM内存配置过低,当应用程序对内存的需求超过当前设置时,就会触发内存溢出错误(如`OutOfMemoryError`),进而可能导致WebLogic服务中断。 #### 四、解决方案 为了解决上述问题...
通过对这些指标的实时监测,可以及时发现内存泄露风险,优化内存管理策略,保障Apusic服务器的健康运行。 - **CPU监控**: CPU使用率、热点方法分析等功能,帮助识别CPU密集型操作,定位性能瓶颈。结合线程监控模块...
### JVM与Hadoop介绍 #### 一、Java虚拟机(JVM)概述 Java虚拟机(JVM)是执行Java字节码...同时,Hadoop作为一种分布式计算框架,与JVM紧密相连,利用JVM的强大功能处理大规模数据集,是大数据处理领域的关键技术之一。
Java虚拟机(JVM)负责管理Java程序的内存分配与回收,其中HotSpot是JVM的一种实现,也是Java应用最为广泛的实现之一。HotSpot虚拟机中的垃圾回收机制(GC)是JVM内存管理的核心部分。它包括多种策略,其中最常见的...
【WebSphere应用服务器内存泄漏探测与诊断工具】 内存泄漏是应用程序性能问题的常见表现,它会导致系统可用内存逐渐减少,最终引发内存不足(OutOfMemory)的严重情况,甚至导致系统崩溃。由于Java堆内存中对象及其...
- **直接内存**:这部分内存并不属于JVM管理的内存的一部分,它由`NIO`类通过`sun.misc.Unsafe`的API直接分配。它的大小不受`-Xmx`的影响,而是受到本机总内存的限制。 - **Java栈**:每个线程拥有一个独立的Java栈...
这篇文章将深入探讨Tomcat调优与JVM参数优化的各个方面,帮助你提升服务器性能。 首先,我们来了解一下Tomcat调优的基础知识。Tomcat调优主要包括以下几个方面: 1. **线程池配置**:调整`maxThreads`和`...
### Java应用服务器系统企业版8.1管理指南2005 #### 1. 关于Sun Java System Application Server Enterprise Edition 8.1 Sun Java System Application Server Enterprise Edition 8.1是一款面向企业级应用的强大...
本文档旨在对Sun J2SE 5.0版本中的Java HotSpot虚拟机(JVM)内存管理机制进行全面概述,包括不同类型的内存收集器及其配置方法、如何调整收集器内存区域的大小等。此外,还将提供一些影响内存收集器行为的常见选项,...
可以看到本地及远程服务器上的Java进程,并进行连接。你可以选择要监控的应用,获取其JVM配置信息,包括JVM参数、类路径、模块系统等。 3. **性能监视** - **内存监控**:实时显示堆内存、非堆内存、eden区、...
理解JVM的工作机制对于优化Java应用的性能和解决内存问题至关重要。 **后端开发中的Java** 在后端开发中,Java常常用于构建服务器端应用,如Web服务器、分布式系统、数据库连接、微服务等。Spring框架是Java后端...
WebLogic Server 10 是一款由 Oracle 公司提供的企业级 Java 应用服务器,用于部署和管理 Java 应用程序。在运行大型或者复杂的Java应用程序时,优化虚拟内存(也称为堆内存)的大小至关重要,因为它直接影响到应用...