作者:Jason S.H.Chen
怎样调整JVM参数让系统在特定硬件配置下达到最优化的性能。
通过上篇SUN JVM内存管理机制的介绍,大家都知道了SUN JVM内存分为永久存储区,伊甸园,幸存者0区,幸存者1区和养老区等几个区域。他们的作用以及垃圾回收处理过程在上篇也做了详细介绍。下面我们就来看看和这些内存分区相关的JVM参数。
JVM相关参数:
参数名 参数说明
-server 启用能够执行优化的编译器, 显著提高服务器的性能,但使用能够执行优化的编译器时,服务器的预备时间将会较长。生产环境的服务器强烈推荐设置此参数。
-Xss 单个线程堆栈大小值;JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:+UseParNewGC 可用来设置年轻代为并发收集【多CPU】,如果你的服务器有多个CPU,你可以开启此参数;开启此参数,多个CPU可并发进行垃圾回收,可提高垃圾回收的速度。此参数和+UseParallelGC,-XX:ParallelGCThreads搭配使用。
+UseParallelGC 选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集 。可提高系统的吞吐量。
-XX:ParallelGCThreads 年轻代并行垃圾收集的前提下(对并发也有效果)的线程数,增加并行度,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
永久存储区相关参数:
参数名 参数说明
-Xnoclassgc 每次永久存储区满了后一般GC算法在做扩展分配内存前都会触发一次FULL GC,除非设置了-Xnoclassgc.
-XX:PermSize 应用服务器启动时,永久存储区的初始内存大
-XX:MaxPermSize 应用运行中,永久存储区的极限值。为了不消耗扩大JVM永久存储区分配的开销,将此参数和-XX:PermSize这个两个值设为相等。
堆空间相关参数
参数名 参数说明
-Xms 启动应用时,JVM堆空间的初始大小值。
-Xmx 应用运行中,JVM堆空间的极限值。为了不消耗扩大JVM堆控件分配的开销,将此参数和-Xms这个两个值设为相等,考虑到需要开线程,讲此值设置为总内存的80%.
-Xmn 此参数硬性规定堆空间的新生代空间大小,推荐设为堆空间大小的1/4。
上面所列的JVM参数关系到系统的性能,而其中-XX:PermSize,-XX:MaxPermSize,-Xms,-Xmx和-Xmn这5个参数更是直接关系到系统的性能,系统是否会出现内存溢出。
-XX:PermSize和-XX:MaxPermSize分别设置应用服务器启动时,永久存储区的初始大小和极限大小;在生成环境中强烈推荐将这个两个值设置为相同的值,以避免分配永久存储区的开销,具体的值可取系统“疲劳测试”获取到的永久存储区的极限值;如果不进行设置-XX:MaxPermSize默认值为64M,一般来说系统的类定义文件大小都会超过这个默认值。
-Xms和-Xmx分别是服务器启动时,堆空间的初始大小和极限值。-Xms的默认值是物理内存的1/64但小于1G,-Xmx的默认值是物理内存的1/4但小于1G.在生产环境中这些默认值是肯定不能满足我们的需要的。也就是你的服务器有8g的内存,不对JVM参数进行设置优化,应用服务器启动时还是按默认值来分配和约束JVM对内存资源的使用,不会充分的利用所有的内存资源。
到此我们就不难理解上文提到的“我的服务器有8g内存,系统也就100M左右,居然出现内存溢出”这个“怪现象”了。在上文我曾提到“永久存储区溢出(java.lang.OutOfMemoryError: Java Permanent Space)”和“JVM堆空间溢出(java.lang.OutOfMemoryError: Java heap space)”这两种溢出错误。现在大家都知道答案了:“永久存储区溢出(java.lang.OutOfMemoryError: Java Permanent Space)”乃是永久存储区设置太小,不能满足系统需要的大小,此时只需要调整-XX:PermSize和-XX:MaxPermSize这两个参数即可。“JVM堆空间溢出(java.lang.OutOfMemoryError: Java heap space)”错误是JVM堆空间不足,此时只需要调整-Xms和-Xmx这两个参数即可。
到此我们知道了,当系统出现内存溢出时,是哪些参数设置不合理需要调整。但我们怎么知道服务器启动时,到底JVM内存相关参数的值是多少呢。在实践中,经常遇到对JVM参数进行设置了,并且自己心里觉得应该不会出现内存溢出了;但不幸的是内存溢出还是发生了。很多人百思不得其解,那我可以肯定地告诉你,你设置的JVM参数并没有起作用(本文咱不探讨没有起作用的原因)。不信我们就去看看,下面介绍如何使用SUN公司的内存使用监控工具jvmstat.
本文只介绍如何使用jvmstat查看内存使用,不介绍其安装配置。有兴趣的读者,可到SUN公司的官方网站下载一个,他本身已经带有非常详细的安装配置文档了。这里假设你已经在你的应用服务器上配置好了jvmstat了。那我们就开始使用他来看看我们的服务器到底是有没有按照我们设置的参数启动。
首先启动服务器,等服务器启动完。开启DOS窗口(此例子是在windows下完成,linux下同样),在dos窗口中输入jps这个命令。如下图
窗口中会显示所有JAVA应用进程列表,列表的第一列为应用的进程ID,第二列为应用的名字。在列表中找到你的应用服务器的进程ID,比如我这里的应用服务器进程ID为1856.在命令行输入visualgc 1856回车。进入jvmstat的主界面,如下图:
上图分别标注了伊甸园,幸存者0区,幸存者1区,养老区和永久存储区。图上直观的反应出各存储区的大小,已经使用的大小,剩下的空间大小,并用数字标出了各区的大小;如果你这上面的数字和你设置的JVM参数相同的话,那么恭喜你,你设置的参数已经起作用,如果和你设置的不一致的话,那么你设置的参数没有起作用(可能是服务器的启动方式没有载入你的JVM参数设置。)
在优化服务器的时候,这个工具很有用,他占用资源少。可以随应用服务器一直保持开启状态,如果系统发生内粗溢出,可以一眼就看出是那个区发生了溢出。根据观察结果进行进一步优化。
- 大小: 34.7 KB
- 大小: 43.4 KB
分享到:
相关推荐
### 设置JVM内存的方法 ...通过对不同场景下的JVM内存配置方法进行了解和实践,可以有效地优化Java应用程序的表现,确保其稳定运行。此外,根据项目的实际需求灵活调整内存参数,也是提升开发效率的重要手段之一。
在IT领域,特别是Web应用服务器管理中,正确配置Java虚拟机(JVM)的内存大小对于确保应用程序的稳定性和性能至关重要。本文将详细探讨如何在Tomcat服务器上配置JVM内存,包括其背景、配置方法以及最佳实践。 #### ...
理解基本的概念对于优化内存使用至关重要。 - **Java堆内存(Heap)**:这是JVM分配Java对象的主要内存空间,包含活动对象以及不可达的对象。堆内存的大小可以通过`-Xms`和`-Xmx`参数来定义。 - **永久代(Permanent ...
- **参数调优**: 根据应用的特点调整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控制台,选择“服务器”>“服务器实例”,然后选择需要查看的服务器实例,在“常规”选项卡下的“Java和进程”部分可以查看JVM的内存配置信息。 ##### 2. 修改JVM内存配置 编辑`Middleware/user_...
通过对这些指标的实时监测,可以及时发现内存泄露风险,优化内存管理策略,保障Apusic服务器的健康运行。 - **CPU监控**: CPU使用率、热点方法分析等功能,帮助识别CPU密集型操作,定位性能瓶颈。结合线程监控模块...
### JVM与Hadoop介绍 #### 一、Java虚拟机(JVM)概述 Java虚拟机(JVM)是执行Java字节码...同时,Hadoop作为一种分布式计算框架,与JVM紧密相连,利用JVM的强大功能处理大规模数据集,是大数据处理领域的关键技术之一。
【WebSphere应用服务器内存泄漏探测与诊断工具】 内存泄漏是应用程序性能问题的常见表现,它会导致系统可用内存逐渐减少,最终引发内存不足(OutOfMemory)的严重情况,甚至导致系统崩溃。由于Java堆内存中对象及其...
Java虚拟机(JVM)负责管理Java程序的内存分配与回收,其中HotSpot是JVM的一种实现,也是Java应用最为广泛的实现之一。HotSpot虚拟机中的垃圾回收机制(GC)是JVM内存管理的核心部分。它包括多种策略,其中最常见的...
- **直接内存**:这部分内存并不属于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是一款面向企业级应用的强大...
理解JVM的工作机制对于优化Java应用的性能和解决内存问题至关重要。 **后端开发中的Java** 在后端开发中,Java常常用于构建服务器端应用,如Web服务器、分布式系统、数据库连接、微服务等。Spring框架是Java后端...
根据监控数据,VisualVM可以给出优化建议,如调整内存分配、优化线程池设置等,帮助提升应用性能。 通过深入理解和熟练使用VisualVM,Java开发者能够更好地理解应用程序的运行状态,及时发现和解决性能问题,提升...
本文档旨在对Sun J2SE 5.0版本中的Java HotSpot虚拟机(JVM)内存管理机制进行全面概述,包括不同类型的内存收集器及其配置方法、如何调整收集器内存区域的大小等。此外,还将提供一些影响内存收集器行为的常见选项,...
WebLogic Server 10 是一款由 Oracle 公司提供的企业级 Java 应用服务器,用于部署和管理 Java 应用程序。在运行大型或者复杂的Java应用程序时,优化虚拟内存(也称为堆内存)的大小至关重要,因为它直接影响到应用...