JVM调优总结 -Xms -Xmx -Xmn -Xss
三、常见配置举例 堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k–Xmx3550m:设置JVM最大可用内存为3550M。-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6-XX:MaxPermSize=16m:设置持久代大小为16m。-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 回收器选择JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。 吞吐量优先的并行收集器如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。典型配置: java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。 […]
Resin 3 pro高并发,响应性与稳定性方案
以下方案我是在Intel xeon(至强) 3.2G 2个双核物理CPU+2G内存(Ecc)上进行:resin版本为resin-pro-3.0.21,JVM为Jrockit 1.5_06, resin java 启动参数 -Xms256m -Xmx512m1. 以下为resin.conf配置<!– – Resin 3.0 configuration file. –> <resin xmlns=“http://caucho.com/ns/resin” xmlns:resin=“http://caucho.com/ns/resin/core”> <!– – Logging configuration for the JDK logging API. –> <log name=“” level=“all” path=“stdout:” timestamp=“[%H:%M:%S.%s] “/> <logger name=“com.caucho.java” level=“config”/> <logger name=“com.caucho.loader” level=“config”/> <dependency-check-interval>600s</dependency-check-interval> <javac compiler=“internal” args=“”/> <thread-pool> <thread-max>10240</thread-max> <spare-thread-min>50</spare-thread-min> </thread-pool> <min-free-memory>5M</min-free-memory> <server> <class-loader> <tree-loader path=“${resin.home}/lib”/> […]
resin服务器突然变慢问题解决办法.
本人负责的一个网站不知道为什么,由周一开始,突然间变得很慢,有时则很快.搞来搞去,搞了差不多一个星期(部份时间开发新功能去了).终于找到原因了. 服务器情况: linux as4 Intel(R) Xeon(R) CPU 5130 @ 2.00GHz 4G内存, 300Gscsi+320GSATA硬盘. resin 3.0.23+ lighttpd resin启动参数 -server -verbose:gc -Xdebug -Xloggc:gc.log -Djava.awt.headless=true -XX:PermSize=128M -XX:NewRatio=4 -XX:+UseConcMarkSweepGC -XX:MaxPermSize=200m -XX:NewSize=100 -XX:MaxNewSize=128m -Xmn256m -Xms512m -Xmx512m 服务器运行一直很正常,到了周一,网站变慢,CPU占用50%以上,但内存点使用50%,其中大部分是mysql用去了.load average: 10.02, 10.03, 10.00 . 全部程序都测试过.底层代码也查过.JDK换过,RESIN版本换过,mysql配置也换过.问题依然存在. 利用resin-admin查看情况. Total memory: 501.44Meg Free memory: 350.37Meg 看上去也正常.不过free memory 变化的很快,由100多M,突然变到300多M.一开始还以为是程序释放了内存.就不去管他了. […]
使用ping功能使resin更健壮
由于种种原因,resin有时会遇到resin down机的情况,比如:java.lang.OutOfMemoryError。这样的问题如果从代码角度来解决问题,也不是一时半会能解决的,应急解决方案是启用resin-pro的ping功能。 <resin:if test=”${isResinProfessional}”> <ping> <url>http://localhost:8080/ping.jsp</url> <sleep-time>1m</sleep-time> <try-count>5</try-count> <socket-timeout>30s</socket-timeout> </ping> </resin:if> ping.jsp可随意写一些代码,纯html代码也行,只能服务器能响应返回200。 如果访问resin访问http://localhost:8080/ping.jsp返回不是200 code,然后再重试try-count次,如果依然不响应200,则将自动重启resin服务。 如果在resin tag下配置了: <system-property mail.smtp.host=”127.0.0.1″/> <system-property mail.smtp.port=”25″/> 还可以让resin自动给你发个邮件通知你它自动重启过了: <ping resin:type=”com.caucho.server.admin.PingMailer”> <url>http://localhost:8080/ping.jsp</url> <mail-to>[email protected]</mail-to> <mail-from>[email protected]</mail-from> <mail-subject>Resin ping has failed for server ${’${’}server.name}</mail-subject> </ping> 这样配置好了,不管resin出现什么故障,只要resin进程不死,就可以放心睡大觉了。 如果还启用了resin的session持久化存储,用户基本感觉不到服务已经重启过了。 如果启用了resin的cluster,那么请修改httpd.sh,将-server参数加上,不然重启resin后是没有cluster的。
破解resin-pro-3.1
在网上查看了很多关于resin性能的文章,比较公认的说法是resin比tomcat的性能要高很多。 但最近在csdn上看了一篇文章,说resin 3.x的免费版与tomcat性能已经不相上下了。原因有两个: 1、tomcat从5.0后就开始在性能上不断改进,以达到生产环境的要求; 2、resin从3.0开始分为免费版与pro版,更多的性能改进被放到了pro版中了,所以免费版的性能就下降了。 基于这样的一些原因,更由于resin的pro版支持session持久化存储、负载均衡及cache等高端特性,于是对破解resin pro版产生了兴趣。 经过N个夜晚的奋战,终于把这个pro版给破解了。 网上也有人说破解得不好的resin pro版可能会使性能下降,个人感觉不存在这样的问题,只要破解了即可享用pro版的各种特性,性能也有大幅提高。 以下的resin启动的部分输出: Resin Professional 3.1.4 (built Tue, 04 Dec 2007 11:27:12 PST)Copyright(c) 1998-2007 Caucho Technology. All rights reserved. Starting Resin on Mon, 31 Dec 2007 17:18:52 +0800 (CST) [17:18:53.640] {main} Proxy Cache disk-size=1024M memory-size=64M[17:18:53.656] {main} PingThread[] starting, checking [][17:18:54.109] {main}[17:18:54.234] {main} Windows XP 5.1 x86[17:18:54.343] {main} […]
lighttpd configure java web server
我的apache 2.061在window 2003 下老是报告错误,虽然也可以使用但感觉很不爽.错误入下,找了很久也没有办法,包括修复sockt也没用.报告队列中的错误: 错误应用程序 Apache.exe,版本 2.0.61.200,错误模块 ntdll.dll,版本 5.2.3790.3959,错误地一直想找一个替代apache的软件,最近看了lighttpd想用lighttpd来替代apache,先下放过资料.下载地址.http://ftp.dtech.hu/pub/WLMP-Project/LightTPD-Win32/ . When to use lighttpd You can use lighttpd to secure access to your application server reduce load on your server by offloading static requests load balance your application servers use lighttpd’s spambot and bad bot blocking capabilities get more request rewriting and redirecting flexibility use […]
Configure lighttpd alias (mod_alias)
This lighttpd module provides for mapping different parts of the host filesystem in the document tree. You can use it for mapping various directories. For example cgi-bin directory mapped to /var/lib/cgi-bin. Configuration Open your lighttpd configuration file: vi /etc/lighttpd/lighttpd.conf Append/add mod_ alias to list of server modules:server.modules += ( “mod_alias” ) Examples Add cgi-bin alias […]
巧用tmpfs加速你的linux服务器
巧用tmpfs加速你的linux服务器 今天从朋友高春辉那里又学了一招,就是使用tmpfs,我把他消化后用来实现虚拟磁盘来存放squid的缓存文件和php的seesion。速度快不少哦! 默认系统就会加载/dev/shm ,它就是所谓的tmpfs,有人说跟ramdisk(虚拟磁盘),但不一样。象虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。 tmpfs有以下优势:1。动态文件系统的大小,2。tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。3。tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。 好了讲了一些大道理,大家看的烦了吧,还是讲讲我的应用吧:) 首先在/dev/stm建个tmp文件夹,然后与实际/tmp绑定 mkdir /dev/shm/tmpchmod 1777 /dev/shm/tmpmount –bind /dev/shm/tmp /tmp 1。squid的缓存目录设置 vi /etc/squid/squid.conf 修改成cache_dir ufs /tmp 256 16 256这里的第一个256表示使用256M内存,我觉得高性能LINUX双效防火墙HOWTO使用ramdisk的方法还不如直接使用tmpfs,至少每次启动不用mkfs,还可以动态改变大小。 然后重启一下服务,ok,现在所有的squid缓存文件都保存倒tmpfs文件系统里了,很快哦。 2。对php性能的优化 对于一个访问量大的以apache+php的网站,可能tmp下的临时文件都会很多,比如seesion或者一些缓存文件,那么你可以把它保存到tmpfs文件。 保存seesion的方法很简单了只要修改php.ini就行了,由于我已经把/dev/stm/tmp与/tmp绑定,所以不改写也行,至于php程序产生的缓存文件那只能改自己的php程序了:) 希望我的这个方法,能对你有所启发。 参考文档:使用虚拟内存(virtual memory,VM)文件系统和绑定安装
lucene简单实例
写文章的时候,感觉比较难写的就是标题,有时候不知道起什么名字好,反正这里写的都是关于lucene的一些简单的实例,就随便起啦. Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索 来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已—-因为这一个世界有一种好东西,叫搜索。 IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。 Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。 Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。 Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。 Field:字段。 IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具; Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。 QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。 Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。 上面作了一大堆名词解释,下面就看几个简单的实例吧: 1、简单的的StandardAnalyzer测试例子 Java代码 package lighter.javaeye.com; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Token; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.standard.StandardAnalyzer; public class StandardAnalyzerTest { //构造函数, public StandardAnalyzerTest() { } public static void main(String[] args) { //生成一个StandardAnalyzer对象 Analyzer aAnalyzer = new StandardAnalyzer(); //测试字符串 StringReader sr = new StringReader(“lighter javaeye com is the are on”); //生成TokenStream对象 TokenStream ts = aAnalyzer.tokenStream(“name”, sr); try { int i=0; Token t = ts.next(); while(t!=null) { //辅助输出时显示行号 i++; //输出处理后的字符 System.out.println(“第”+i+“行:”+t.termText()); //取得下一个字符 t=ts.next(); } } catch (IOException e) { e.printStackTrace(); […]
lucene的简单实例
说明一下,这一篇文章的用到的lucene,是用2.0版本的,主要在查询的时候2.0版本的lucene与以前的版本有了一些区别. 其实这一些代码都是早几个月写的,自己很懒,所以到今天才写到自己的博客上,高深的文章自己写不了,只能记录下一些简单的记录与点滴,其中的代码算是自娱自乐的,希望高手不要把重构之类的砸下来… 1、在windows系统下的的C盘,建一个名叫s的文件夹,在该文件夹里面随便建三个txt文件,随便起名啦,就叫”1.txt”,”2.txt”和”3.txt”啦 其中1.txt的内容如下: Java代码 中华人民共和国 全国人民 2006年 中华人民共和国 全国人民 2006年而”2.txt”和”3.txt”的内容也可以随便写几写,这里懒写,就复制一个和1.txt文件的内容一样吧 2、下载lucene包,放在classpath路径中 建立索引: Java代码 package lighter.javaeye.com; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Date; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; /** * author lighter date 2006-8-7 */ public class TextFileIndexer { public static void main(String[] args) throws Exception { /* 指明要索引文件夹的位置,这里是C盘的S文件夹下 */ File fileDir = new File(“c:\\s”); /* 这里放索引文件的位置 */ File indexDir = new File(“c:\\index”); Analyzer luceneAnalyzer = new StandardAnalyzer(); IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, true); File[] textFiles = fileDir.listFiles(); long startTime = new Date().getTime(); //增加document到索引去 for (int i = 0; i < textFiles.length; i++) { if (textFiles[i].isFile() && textFiles[i].getName().endsWith(“.txt”)) { System.out.println(“File “ + textFiles[i].getCanonicalPath() + “正在被索引….”); String temp = FileReaderAll(textFiles[i].getCanonicalPath(), “GBK”); System.out.println(temp); Document document = new Document(); Field FieldPath = new Field(“path”, textFiles[i].getPath(), […]