首页 > 其他分享 >jvm参数调优

jvm参数调优

时间:2023-07-24 16:02:42浏览次数:42  
标签:log boss XX 调优 参数 内存 jvm 128m CMS


PE2950 8G  双cpu,每cpu四核,raid1,两个tomcat6.0.14

 


1. JAVA_OPTS='-server -Xms2560m -Xmx2560m -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m <strong>-Xss256k  </strong>  
2. 6 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxTenuringThreshold=5 -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Xloggc:/var/log/boss/gc-a.log -Djava.awt.headless=true -XX:+DisableExplicitGC -Dlog.home=/var/log/boss/boss-a -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false'


 

 曾用过的:



1. #JAVA_OPTS='-server -Xms2560m -Xmx2560m -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:ParallelGCThreads=6 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxTenuringThreshold=5 -XX:SurvivorRatio=8 -verbose:gc -XX:+PrintGCDetails -Xloggc:/var/log/boss/gc-a.log -Djava.awt.headless=true -XX:+ExplicitGCInvokesConcurrent -Dlog.home=/var/log/boss/boss-a -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false'
2. #JAVA_OPTS='-server -Xms2048m -Xmx2048m -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Djava.awt.headless=true -XX:+DisableExplicitGC -Xloggc:/var/log/boss/gc-a.log -Dlog.home=/var/log/boss/boss-a'
3. #JAVA_OPTS='-server -Xms2048m -Xmx2048m -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Djava.awt.headless=true -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:/var/log/boss/gc-a.log -Dlog.home=/var/log/boss/boss-a -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+ExplicitGCInvokesConcurrent'


 

 

  其它重要选项

-verbose:gc

-XX:+UseParallelOldGC(请注意,并行缩并在与并发标记清除(mark-sweep)收集器结合使用时不可用;它只能和并行年轻代收集器(-XX:+UseParallelGC)一起使用)

-XX:+ExplicitGCInvokesConcurrent

提示:一般的Young Generation的大小是整个Heap size的1/4。Young generation的minor收集率应一般在70%以上。当然在实际的应用中需要根据具体情况进行调整。

 

http://www.tot.name/show/3/7/20061112220201.htm

http://calvin.iteye.com/blog/212967

-Xrunhprof:heap=sites

 

GC日志分析工具:

GC portal

http://java.sun.com/developer/technicalArticles/Programming/GCPortal/

HPjmeter

Jtune

gcviewer

 

JVM 选项全集:

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

 

 

 

调优总结:

http://unixboy.iteye.com/blog/174173

 

http://calvin.iteye.com/blog/91905

 

http://wxw850227.iteye.com/blog/255242

 

http://sdh5724.iteye.com/blog/283977

 

<本文提供的设置仅仅是在高压力, 多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:

  1. 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 
  1. 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 锁机制的性能改善。

 


标签:log,boss,XX,调优,参数,内存,jvm,128m,CMS
From: https://blog.51cto.com/u_16087105/6836063

相关文章

  • Ruby Ruport实践—报表参数实现
    此例子在RubyRuport实践—简单报表系统及RubyRuport实践—中文PDF报表之PRAWN 的基础上进行完善,添加了对报表参数的设计及实现。 一、创建数据表report_parameterscreatetablereport_parameters(report_parameter_idintegernotnullauto_increment,report_execute_......
  • 【遇到一个神奇的问题】暂未想到原因,http.Post 传入 nil参数正确,但是传输值为 nil 的
    出错的代码如下:funcgetEab(ctxcontext.Context,credentialsJSONstring,old*externalAccountKeyResp)(*externalAccountKeyResp,error){//inithttpclient// varpostData*bytes.Reader=nil ifold!=nil{ buf,_:=json.Marshal(old) postData......
  • boss学习笔记 定位参数 zp_stoken
    1.在控制台搜索_$,找到到这个函数  2.在这个地方往下找,找到有return的地方,在这里打上断点,然后就可以点击下一页3.打上断点后,可以看到D的值已经生成了,和本地里面调试对比了很多次,发现这个L就和zp生成有关系,所以本地这里的L一样,代表和浏览器生成的值也是一样的 4.所以可......
  • m基于扩频解扩+turbo译码的通信链路matlab误码率仿真,调制对比QPSK,16QAM,64QAM,扩频
    1.算法仿真效果matlab2022a仿真结果如下:      2.算法涉及理论知识概要       基于扩频解扩和Turbo编译码的通信链路误码率仿真,并比较了不同调制方式下的性能。首先,我们详细讨论了实现步骤,包括扩频解扩、调制、编码和译码等。然后,给出了相关的数学公式,包......
  • 开源jvm性能基准测试工具之renaissance
    JVM标准的性能测试工具是SPECjbb2015,SPECjbb2015是SPEC组织的一个用于评估服务器端Java应用性能的基准测试程序,其官方主页为 https://www.spec.org/jbb2015 。在其之前还有SPECjbb2013、SPECjbb2005等版本。该基准测试主要测试Java虚拟机(JVM)、JIT编译器、垃圾回收、Java线程......
  • Java虚拟机(JVM):第六幕:自动内存管理 - 选择合适的垃圾收集器
    前言:在虚拟机的世界里面,内置了很多的垃圾收集器,但并不是说最先进的就是最好的。有一句话说的好“因地制宜”;一、Epsilon收集器是一个无操作的收集器,但是贴切的来说是“自动内存管理子系统”。但是一个垃圾收集器的工作不仅仅只有垃圾收集,还负责堆的管理与布局、对象的分配、......
  • clang中参数入栈顺序问题
    在clang中,函数调用的参数入栈顺序是从右往左,而在gcc中参数入栈顺序是从左往右。遇到这个问题的场景是现有项目中有一段代码,在gcc下编译后执行是没问题的,但是在clang下执行却一直报错,通过debug后发现,是由于函数参数的入栈顺序不同导致的。问题代码的逻辑类似于以下demo:#include......
  • dockercompose yaml命令行参数
    如何使用docker-compose的命令行参数1.确定所需的命令行参数在使用docker-compose命令行工具时,可以通过添加一些参数来自定义和控制容器的行为。以下是一些常见的命令行参数:参数描述-f,--file指定docker-compose文件的路径-p,--project-name指定项目的名称-......
  • JVM狂
    狂神说笔记——JVM入门07JVM入门参考视频:B站狂神,写这个只是方便个人复习,怎么写是我自己的事,我能看懂就行,没要求非要让你看!白嫖还挑刺,是很没有风度的事情。希望做个有风度的“五好青年”!面试常见:请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新?什么是OOM,什......
  • 爬虫----request中的cookies参数
    importrequests#url='https://www.baidu.com/s?wd=python'url='https://home.cnblogs.com/u/dddzy/'#kw={'wd':'python'}headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit......