<本文提供的设置仅仅是在高压力, 多CPU, 高内存环境下设置>
最近对JVM的参数重新看了下, 把应用的JVM参数调整了下。 几个重要的参数
-server -Xmx3g -Xms3g -XX:MaxPermSize=128m
-XX:NewRatio=1 eden/old 的比例
-XX:SurvivorRatio=8 s/e的比例
-XX:+UseParallelGC
-XX:ParallelGCThreads=8
-XX:+UseParallelOldGC 这个是JAVA 6出现的参数选项
-XX:LargePageSizeInBytes=128m 内存页的大小, 不可设置过大, 会影响Perm的大小。
-XX:+UseFastAccessorMethods 原始类型的快速优化
-XX:+DisableExplicitGC 关闭System.gc()
另外 -Xss 是线程栈的大小, 这个参数需要严格的测试, 一般小的应用, 如果栈不是很深, 应该是128k够用的, 不过,我们的应用调用深度比较大, 还需要做详细的测试。 这个选项对性能的影响比较大。 建议使用256K的大小.
例子:
-server -Xmx3g -Xms3g -Xmn=1g -XX:MaxPermSize=128m -Xss256k
-XX:MaxTenuringThreshold=10 -XX:+DisableExplicitGC -XX:+UseParallelGC
-XX:+UseParallelOld GC -XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+AggressiveOpts -XX:+UseBiasedLocking
-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 打印参数
=================================================================
另外对于大内存设置的要求:
Linux
:
Large page support is included in 2.6 kernel. Some vendors have
backported the code to their 2.4 based releases. To check if your system can support
large page memory, try the following:
# cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
#
If the output shows the three "Huge" variables then your system
can support large page memory, but it needs to be configured.
If the command doesn't print out anything, then large page support is
not available. To configure the system to use large page memory, one must log in as root, then:
-
Increase SHMMAX value. It must be larger than the Java heap size. On a system with 4 GB of physical RAM (or less) the following
will make all the memory sharable:
# echo 4294967295 > /proc/sys/kernel/shmmax
-
Specify the number of large pages. In the following example 3 GB of a 4 GB system are reserved for large pages (assuming a large
page size of 2048k, then 3g = 3 x 1024m = 3072m = 3072 * 1024k = 3145728k, and 3145728k / 2048k = 1536):
# echo 1536 > /proc/sys/vm/nr_hugepages
Note the /proc values will reset after reboot so you may want to set them in an init script (e.g. rc.local or sysctl.conf).
=============================================
这个设置, 目前观察下来的结果是EDEN区域收集明显速度比较快, 最多几个ms, 但是,对于FGC, 大约需要0。9, 但是发生时间非常的长,
应该是影响不大。 但是对于非web应用的中间件服务, 这个设置很要不得, 可能导致很严重延迟效果. 因此, CMS必然需要被使用,
下面是CMS的重要参数介绍
关于CMS的设置:
使用CMS的前提条件是你有比较的长生命对象, 比如有200M以上的OLD堆占用。 那么这个威力非常猛,
可以极大的提高的FGC的收集能力。 如果你的OLD占用非常的少, 别用了, 绝对降低你性能, 因为CMS收集有2个STOP WORLD的行为。
OLD少的清情况, 根据我的测试, 使用并行收集参数会比较好。
-XX:+UseConcMarkSweepGC 使用CMS内存收集
-XX:+AggressiveHeap 特别说明下:(我感觉对于做java cache应用有帮助)
-
试图是使用大量的物理内存
-
长时间大内存使用的优化,能检查计算资源(内存, 处理器数量)
-
至少需要256MB内存
-
大量的CPU/内存, (在1.4.1在4CPU的机器上已经显示有提升)
-XX:+UseParNewGC 允许多线程收集新生代
-XX:+CMSParallelRemarkEnabled 降低标记停顿
-XX+UseCMSCompactAtFullCollection 在FULL GC的时候, 压缩内存, CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。
压力测试下合适结果:
-server -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xmx2g -Xms2g
-Xmn256m -XX:PermSize=128m -Xss256k -XX:MaxTenuringThreshold=31
-XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods
由于Jdk1.5.09及之前的bug, 因此, CMS下的GC, 在这些版本的表现是十分糟糕的。 需要另外2个参数来控制cms的启动时间:
-XX:+UseCMSInitiatingOccupancyOnly 仅仅使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 CMS堆上, 使用70%后开始CMS收集。
使用CMS的好处是用尽量少的新生代、,我的经验值是128M-256M, 然后老生代利用CMS并行收集, 这样能保证系统低延迟的吞吐效率。 实际上cms的收集停顿时间非常的短,2G的内存, 大约20-80ms的应用程序停顿时间。
=========系统情况介绍========================
这个例子是测试系统12小时运行后的情况:
$uname -a
2.4.21-51.EL3.customsmp #1 SMP Fri Jun 27 10:44:12 CST 2008 i686 i686 i386 GNU/Linux
$ free -m
total used free shared buffers cached
Mem: 3995 3910 85 0 162 1267
-/+ buffers/cache: 2479 1515
Swap: 2047 0 2047
$ jstat -gcutil 23959 1000
S0 S1 E O P YGC YGCT FGC FGCT GCT
59.06 0.00 45.77 44.45 56.88 15204 324.023 66 1.668 325.691
0.00 39.66 27.53 44.73 56.88 15205 324.046 66 1.668 325.715
53.42 0.00 22.80 44.73 56.88 15206 324.073 66 1.668 325.741
0.00 44.90 13.73 44.76 56.88 15207 324.094 66 1.668 325.762
51.70 0.00 19.03 44.76 56.88 15208 324.118 66 1.668 325.786
0.00 61.62 19.44 44.98 56.88 15209 324.148 66 1.668 325.816
53.03 0.00 14.00 45.09 56.88 15210 324.172 66 1.668 325.840
53.03 0.00 87.87 45.09 56.88 15210 324.172 66 1.668 325.840
0.00 50.49 72.00 45.22 56.88 15211 324.198 66 1.668 325.866
GC参数配置:
JAVA_OPTS=" -server -XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xmx2g -Xms2g -Xmn256m
-XX:PermSize=128m -Xss256k -XX:MaxTenuringThreshold=31
-XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70 "
实际上我们可以看到并行young gc执行时间是: 324.198s/15211=20ms, cms的执行时间是
1.668/66=25ms. 当然严格来说, 这么算是不对的, 世界停顿的时间要比这是数据稍微大5-10ms. 对我们来说如果不输出日志,
对我们是有参考意义的。
32位系统下, 设置成2G, 非常危险, 除非你确定你的应用占用的native内存很少, 不然可能导致jvm直接crash。
-XX:+AggressiveOpts 加快编译
-XX:+UseBiasedLocking 锁机制的性能改善。
分享到:
相关推荐
本篇文件内容主要介绍了JVM优化的第三部分,重点围绕Tomcat参数调优、JVM参数调优、JVM字节码优化以及代码优化等几个方面。下面是针对这些知识点的详细解释: 1. Tomcat参数调优 在Tomcat参数调优部分,首先介绍了...
下面我们将详细解释几个重要的内存相关参数及其作用: 1. **-Xms**: 设置JVM启动时的初始堆内存大小。例如,`-Xms1024m`表示初始堆内存为1024MB。 2. **-Xmx**: 设置JVM的最大堆内存大小。例如,`-Xmx1024m`表示...
在面临`OutOfMemoryError`时,通常需要关注以下几个方面进行JVM参数调整: 1. **新生代**:新生代的Eden和Survivor区一般不会引发`OutOfMemoryError`,因为垃圾收集频繁进行。但是,如果对象频繁晋升至老生代,可能...
JVM参数调优是提高程序性能的重要手段,主要包括以下几方面: 1. 内存设置:-Xms和-Xmx分别设定堆内存的初始大小和最大值,-XX:NewRatio控制新生代与老年代的比例,-XX:SurvivorRatio则定义新生代中Eden区与...
Java虚拟机(JVM)参数对于优化Java应用程序的性能至关重要。这些参数用于调整JVM的内存分配、垃圾收集行为以及各种其他配置选项。以下是一些关键的JVM参数及其作用: 1. **Xms** 和 **Xmx**: 这两个参数用于设置...
这通常涉及到以下几个方面: 1. 内存配置:通过-Xms和-Xmx设置堆内存的初始大小和最大大小,-XX:NewRatio控制新生代与老年代的比例,-XX:SurvivorRatio设定新生代中Eden区与Survivor区的比例。 2. 垃圾收集器选择...
JVM的运行机制主要包括以下几个关键部分: 1. 类加载子系统:负责加载、验证、解析和初始化.class文件。加载阶段会找到类的二进制数据;验证阶段确保类数据符合Java语义和安全规定;解析阶段将符号引用转换为直接...
JVM内存主要分为以下几个部分: 1. **堆内存(Heap Memory)**:用于存储对象实例、数组等数据。 2. **非堆内存(Non-Heap Memory)**:包括方法区(Method Area)、代码缓存等,主要用于存储类的信息、常量池等。 ...
JVM的启动过程可以分为以下几个关键步骤: 1. **加载**:当Java应用程序启动时,JVM首先通过类加载器加载主类(即包含main方法的类)。类加载器根据类的全限定名查找对应的.class文件,然后将其加载到内存中。类...
优化Tomcat参数主要包括以下几个方面: - **最大连接数**:`maxConnections`和`acceptCount`控制Tomcat接受的最大并发连接数,适当增加可应对高并发场景。 - **线程池**:`minSpareThreads`、`maxThreads`和`...
JVM的学习可以从以下几个重要的知识点开始: 1. **JVM架构**:JVM主要由类装载器、运行时数据区、执行引擎、本地方法接口和本地库组成。了解每个部分的功能对于优化程序性能至关重要。 2. **类装载机制**:包括...
5. **-XX:CMSInitiatingOccupancyFraction**:CMS(Concurrent Mark Sweep)垃圾收集器的一个参数,表示当老年代占用达到这个百分比时启动垃圾收集。 6. **-XX:+UseG1GC** 或 **-XX:+UseParallelGC**:选择不同的...
接下来,Tomcat调优主要包括以下几个方面: 1. **连接器优化**:`Connector`组件负责处理客户端请求。可以通过调整`maxThreads`(最大线程数)和`minSpareThreads`(最小空闲线程数)来平衡响应速度和资源利用率。 ...
- **运行数据区**:包括堆、方法区、虚拟机栈、本地方法栈和程序计数器等几个部分。 - **堆**:存储对象实例,是所有线程共享的一块内存区域。 - **方法区**(在Java 8后变为元空间):存储已加载类的信息,如类...
当Java程序运行时,JVM会经历几个关键阶段:加载、验证、准备、解析和初始化。其中,验证是至关重要的一环,它的目的是确保即将执行的字节码符合Java语言规范,不会对系统造成危害,比如内存溢出、类型不匹配等问题...
在典型的 JVM 实现中,存在一个简单的 CPU 架构模型,包括以下几个主要部分: - **PC(Program Counter)**:程序计数器,用于记录当前正在执行的指令的位置。 - **Operand Stack Pointer**:操作数栈指针,用于...