Jboss 优化配置--Linux篇

 

实时监控内存使用情况

 

1.在命令行使用“Free”命令监控内存使用情况 #free

total used free shared buffers cached

Mem: 256024 192284 63740 0 10676 101004

-/+ buffers/cache: 80604 75420

Swap: 522072 0 522072

 

上面代码给出了一个256MB的RAM和512MB交换空间的系统情况。第三行输出(Mem:)显示物理内存。Total列不显示核心使用的物理内存(通常大约1MB)。Used列显示被使用的内存总额(第二行不计缓冲)。Free列显示全部没有使用的内存。Shared列显示多个进程共享的内存总额。Buffers列显示磁盘缓存的当前大小。第五行(Swap:)对换空间,显示的信息类似上面。如果这行为全0,那么就没有使用对换空间。在缺省的状态下,free命令以千字节(也就是1024字节为单位)来显示内存使用情况。使用-h参数,以字节为单位显内存使用情况;或者使用-m参数,以兆字节为单位显示内存使用情况。还可以通过-s参数,使用命令来不间断地监视内存使用情况:

#free -b -s5

这个命令将会在终端窗口中连续不断地报告内存的使用情况,每5秒钟更新一次。

 

2.使甩vmstat命令监视虚拟内存使用情况 # vmstat

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

1 0 0 63692 10704 101008 0 0 239 42 126 105 48 45 7 0

 

vmstat()命令是一个通用监控程序,是Virtual Meomory Statistics(虚拟内存统计)的缩写。如果使用vmstat命令的时候没有使用任何命令行参数,将会得到一个一次性的报告。vmstat命令报告主要的活动类型有进程(procs)、内存(以千字节为单位)、交换分区(以千字节为单位)、来自块设备(硬盘驱动器)的输入输出量、系统中断(每秒钟发生的次数),以及中央处理单元(CPU)分配给用户、系统和空闲时分别占用的比例。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一. Jboss后台启动: 
添加后台修改命令: 
vi run.sh 
while true; do 
  if [ "x$LAUNCH_JBOSS_IN_BACKGROUND" = "x" ]; then 
      # Execute the JVM in the foreground 
    nohup  "$JAVA" $JAVA_OPTS / 
        -Djava.endorsed.dirs="$JBOSS_ENDORSED_DIRS" / 
        -classpath "$JBOSS_CLASSPATH" / 
        org.jboss.Main "$@" 
      JBOSS_STATUS=$? 
  else 
      # Execute the JVM in the background 
      "$JAVA" $JAVA_OPTS / 
        -Djava.endorsed.dirs="$JBOSS_ENDORSED_DIRS" / 
        -classpath "$JBOSS_CLASSPATH" / 
        org.jboss.Main "$@" & 
      JBOSS_PID=$! 
      # Trap common signals and relay them to the jboss process 
      trap "kill -HUP  $JBOSS_PID" HUP 
      trap "kill -TERM $JBOSS_PID" INT 
      trap "kill -QUIT $JBOSS_PID" QUIT 
      trap "kill -PIPE $JBOSS_PID" PIPE 
      trap "kill -TERM $JBOSS_PID" TERM 
      # Wait until the background process exits 
      WAIT_STATUS=0 
      while [ "$WAIT_STATUS" -ne 127 ]; do 
        JBOSS_STATUS=$WAIT_STATUS 
        wait $JBOSS_PID 2>/dev/null 
        WAIT_STATUS=$? 
      done 
  fi 
  # If restart doesn"t work, check you are running JBossAS 4.0.4+ 
  #    http://jira.jboss.com/jira/browse/JBAS-2483 
  # or the following if you"re running Red Hat 7.0 
  #    http://developer.java.sun.com/developer/bugParade/bugs/4465334.html  
  if [ $JBOSS_STATUS -eq 10 ]; then 
      echo "Restarting JBoss..." 
  else 
      exit $JBOSS_STATUS 
  fi 
done & 
二. Jboss内存优化: 
修改这个两参数,给jvm分配适当的内存,一般为服务器的3/4内存量,推荐至少使用4G内存。 
另外添加两个参数 -XX:+UseParallelGC -XX:+UseParallelOldGC 这两个让服务并行回收内存空间。修改完成后,大致为 JAVA_OPTS = “-Xms4096m -Xmx8192m -XX:+UseParallelGC -XX:+UseParallelOldGC -Dsum…… 
三. Jboss日志输出模式 
[root@190MEM conf]# pwd 
/usr/local/jboss/server/default/conf 
[root@190MEM conf]# vi jboss-log4j.xml 
  <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender"> 
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> 
      <param name="File" value="${jboss.server.log.dir}/server.log"/> 
      <param name="Append" value="false"/> 
      <param name="Threshold" value="ERROR"/> 
四. Jboss数据库连接池优化 
修改数据库连接池: 
<datasources> 
  <local-tx-datasource> 
    <jndi-name>training_master_db </jndi-name>    <connection-url>jdbc:mysql://211.100.192.128:3306/dts?useUnicode=true&amp;characterEncoding=UTF-8 </connection-url> 
    <driver-class>com.mysql.jdbc.Driver </driver-class> 
    <user-name>root </user-name> 
    <password> </password> 
        <min-pool-size>100 </min-pool-size> 
        <max-pool-size>500 </max-pool-size>    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter </exception-sorter-class-name> 
五. Jboss部署目录优化: 
    去掉和应用无关的部署,加快jboss运行速度 
bsh-deployer.xml 
client-deployer-service.xml  
ear-deployer.xml 
ejb-deployer.xml 
http-invoker.sar 
jboss-bean.deployer 
jboss-ws4ee.sar 
jms 
jsr88-service.xml  
schedule-manager-service.xml 
scheduler-service.xml 
sqlexception-service.xml 
uuid-key-generator.sar 
六. Jboss应用安全加固: 
去掉: 
Tomcat status (full) (XML) 
JMX Console 
JBoss Web Console 
删除deploy下的jmx-console.war/ management/ 
[root@190MEM deploy]# pwd 
/usr/local/jboss/server/default/deploy 
[root@190MEM deploy]# ls jmx-console.war/ management/ 
jmx-console.war/: 
checkJNDI.jsp  displayMBeans.jsp    images    inspectMBean.jsp  META-INF          WEB-INF 
cluster        displayOpResult.jsp  index.jsp  jboss.css        style_master.css 

management/: 
console-mgr.sar 
[root@190MEM deploy]#

 

 

 

 

 

 

 

 

概述

为了优化jboss的性能,对jboss服务器做了如下改动。

  1. 设置jvm 参数
  2. 安装jboss-native
  3. 降低jboss输出日志的等级
  4. 起用了jboss内的tomcat对传输数据的压缩功能
  5. 使用ehcache做hibernate的二级缓存

下面就以上的各改动做详细说明,为了表述方便<jboss>代表jboss的安装目录:

设置 jvm 参数

编辑<jboss>/bin/run.conf,  在文件的底部找到对参数JAVA_OPTS进行设置的地方。这个参数会最后传到jvm里。其中

  1. -Xms512m 代表jvm最少用 512m内存
  2. -Xmx1024m 代表jvm最多使用 1024m内存

修改这个两参数,给jvm分配适当的内存,一般为服务器的3/4内存量,推荐至少使用4G内存。
另外添加两个参数 -XX:+UseParallelGC -XX:+UseParallelOldGC 这两个让服务并行回收内存空间。修改完成后,大致为 JAVA_OPTS = “-Xms4096m -Xmx8192m -XX:+UseParallelGC -XX:+UseParallelOldGC -Dsum…….

安装jbossNative

jboss的web container使用的 apache tomcat (http://www.apache.org)。 apache tomcat 有一个扩展包,使tomcat可以通过 java native interface 使用 apache portable runtime (APR),而APR则是大名顶顶的apache httpd 网络服务器的运行时环境。用了这个扩展之后,就使得tomcat可以借助于apache httpd的力量,性能得以提升,尤其是处理静态文件时效率更高。Jboss native,实际上就是tomcat的这个native的扩展,只不过被jboss又添进了一些为了和jboss更好协作而加进去的东西。
要安装jboss native, 按以下步骤进行

  1. 请到jboss的网站上下载,地址是 http://www.jboss.org/jbossweb/downloads/jboss-native/?action=a&windowstate=maximized, 依据服务器环境选择合适的版本。 目前我们用的版本是JBoss Native 2.0.4 Linux x86 
  2. 解压下载后的压缩包到某个目录,比如 jbossNative目录
  3. 将jbossNative/bin/META-INF/bin/linux2/x86/openssl 复制到<jboss>/bin
  4. 在<jboss>/bin目录里建一个文件夹,名为 native
  5. 把jbossNative/bin/META-INF/lib/linux2/x86/ 目录下所有内容复制到上一步建好的<jboss>/bin/native目录下

 

降低jboss输出日志的等级

打开 <jboss>/server/default/conf/jboss-log4j.xml ,这是一个log4j的配置文件。log4j的详细配置说明请参看  http://logging.apache.org/log4j/1.2/index.html  。日志输出的太多,会导致服务器性能降低,所以减少不必要的日志输出。方法大体如下:

  1. 找到 name=”org.jboss” 的category 元素,设置里面的priority元素为 <priority value=”INFO” />
  2. 建一个新的category,内容为 <category name=”javax.faces”><priority value=”INFO” /></category>


log4j 还能够将不同的日志输入到不同的地方,为了以后维护方便,应该将不同 category的日志输入到不同的文件里。详细方法参看上面的网站里的说明。

起用了jboss内的tomcat对传输数据的压缩功能

合同管理里用了大量的javascript css等,为了减少传输时间,可以起用压缩功能。方法是:

  1. 打开<jboss>/server/default/deploy/jboss-web.deployer/server.xml
  2. 找到 protocol=”HTTP/1.1″的 Connector元素,添加属性 URIEncoding=”utf-8″ compression=”on” compressionMinSize=”2048″ noCompressionUserAgents=”gozilla, traviata” compressableMimeType=”text/html,text/xml,text/javascript, text/css, text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml”

添加完后类似于:
<Connector port=”8080″ address=”${jboss.bind.address}”   
maxThreads=”250″ maxHttpHeaderSize=”8192″
emptySessionPath=”true” protocol=”HTTP/1.1″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” URIEncoding=”utf-8″ compression=”on” compressionMinSize=”2048″ noCompressionUserAgents=”gozilla, traviata” compressableMimeType=”text/html,text/xml,text/javascript, text/css, text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml”/>

使用ehcache做hibernate的二级缓存

起用二级缓存,可以大大提高hibernate的运行效率。

  1. 到http://ehcache.sourceforge.net/ 网站下载 ehcache-1.4.1.tgz
  2. 解压到某个目录,例如ehcache目录
  3. 复制 ehcache/ehcache-1.4.1/ehcache-1.4.1.jar, ehcache/ehcache-1.4.1/lib/backport-util-concurrent-3.0.jar和 ehcache/ehcache-1.4.1/lib/jsr107cache-1.0.jar到 <jboss>/server/default/lib目录

1、jboss配置,项目的发布
..../jboss/server/default/deploy/report.war(项目的名称)

2、jboss端口的修改
..../jboss/server/default/deploy/jbossweb-tomcat50.sar/server.xml

3、jboss中数据库的连接配置
..../jboss/server/default/deploy/db2-ds.xml(DB2数据库)

4、jboss部分参数的调整
在E:..../jboss/server/default/conf/jboss-services.xml中修改
 name="jboss.system:service=ThreadPool">
<attribute name="Name">JBoss System Threads</attribute>     
<attribute name="ThreadGroupName">System Threads</attribute>    
<!-- How long a thread will live without any tasks in MS -->    
<attribute name="KeepAliveTime">60000</attribute>     
<!-- The max number of threads in the pool -->    
<attribute name="MaximumPoolSize">300</attribute>    
<!-- The max number of tasks before the queue is full -->    
<attribute name="MaximumQueueSize">1000</attribute>
Name:在poll中threads的名称
ThreadGroupName:threads group的名称
KeepAliveTime:当threads空闲时,保持活动的最长时间(单位毫秒)
MaximumPoolSize:可以并发的threads的最大数目
MaximumQueueSize:允许等待的request的最大数目
BlockingMode:等待队列满了以后的处理方式

5、jboss虚拟内存的分配
在..../jboss/bin/run.sh中修改
JAVA_OPTS=$JAVA_OPTS -Xms512m -Xmx1024m -XX 128k -XX:MaxPermSize=512 -XX:+AggressiveHeap
(1)-XX:+Aggressive会使得-Xmx1024m没有意义。这个参数让JVM忽略Xmx的参数,疯狂的消耗物理内存。
(2)-XX 128k 这使得jboss每增加一个线程(thread)就会立即消耗128k的内存,最佳值是128k,默认值是512.

6、其他项配置
..../jboss/server/default/lib/mysql-connector-java-3.1.12-bin.jar
..../jboss/server/default/conf/standardjaws.xml、standardjboss.xml、standardjbosscmp-jdbc.xml、login-config.xml

 

 

第一, 项目一般都是用utf-8来配置传输参数。如果不配置的话,会默认为系统的编码
那么你首先的修改其编码“jboss-5.0.0.GA/server/default/deploy/jbossweb.sar”中server.xml里面修改成:
     <Connector protocol="HTTP/1.1" port="89" address="0.0.0.0"
               connectionTimeout="20000" redirectPort="8443"  URIEncoding="utf-8" />
port是你要修改外部的访问端口,默认是8080,你发布项目以后可能会改成80,加上URIEncoding=”UTf=8”是保证url传参数是utf-8传输的
    第二,给后台加上权限控制。http://localhost:8080/jmx-console/ 直接可以进入。
修改方法如下
1. default/deploy/jmx-console.war/WEB-INF 目录下的两个文件 web.xml 和 jboss-web.xml
web.xml中去掉<security-constraint>注释
jobss-web.xml中去掉<security-domain>注释
   以上是开启了认证,默认帐户密码是admin/admin
2. 如果修改密码修改如下文件
   /server/default/conf/props  中的jmx-console-users.properties  中admin=admin 格式是用户名=密码,修改后面的admin就可以修改密码
三. JVM的优化。这一步也是至关重要的,首先来普及一下jvm的基础知识
  Jvm分为主要为两大块 ,一个是heap和 no heap ,。
Heap包括三个区域. Eden space ,survivor space ,tenured space.其中surivor space包括两个区,一个是from,一个是to区。下面描述个部分的职责:
Eden是负责新对象的创建区域。当新对象无法在eden区创建的时候,eden区会进行minor gc,会将一些失效的对象清除。会将清除下来的部分对象放到survivor space区域或者tenured space区域。当tenured space的对象越来越多的时候,达到jvm内存不足10%的时候,会进行一次full gc来释放对象。项目要尽可能少的full gc ,应为full gc比较占用内存,一般要求吞吐量比较大的时候,尽量的将new区域设置的比较大一点。也就是eden和survivor这个区域。
下面简要的说一下配置参数
在/bin目录下run.bat文件 用记事本打开 找到
set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -XX:MaxPermSize=256m
-Xms=128m这是heap初始化大小。32bit操作系统最大在1.5g-2g之间。64位的无限制
-Xmx=512m 这是heap最大的大小。尽量的将-Xms和-Xmx大小设置相同,这样避免内存重新分配影响性能
-Xss=128k 线程初始化大小,5.0之前默认是128k,之后为1m,线程机器最大为3000-5000
-XX:MaxPermSize=256m.这是表明持久类,也就是noheap区域的最大为256
-XX:PermSize=256m这个持久区域初始化为256m,一般持久类的大小是64m

这个配置是最常用的配置。如果需要考虑到吞吐量,那么new space和old space你就得重新分配一下
-XX:NewRatio=4
设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4
设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxTenuringThreshold=0 
设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。 对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概论
Jvm垃圾收集器包括三种:串行,并行,并发
串行:处理小型数据,jdk1.4之前默认使用
并行:1.5和1.5之后使用,处理

典型配置:
• 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区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
•  响应时间优先的并发收集器
如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。
典型配置:
• java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
• java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片
常见配置汇总
1.     堆设置
o -Xms:初始堆大小
o -Xmx:最大堆大小
o -XX:NewSize=n:设置年轻代大小
o -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
o -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
o -XX:MaxPermSize=n:设置持久代大小
2. 收集器设置
o -XX:+UseSerialGC:设置串行收集器
o -XX:+UseParallelGC:设置并行收集器
o -XX:+UseParalledlOldGC:设置并行年老代收集器
o -XX:+UseConcMarkSweepGC:设置并发收集器
3. 垃圾回收统计信息
o -XX:+PrintGC
o -XX:+PrintGCDetails
o -XX:+PrintGCTimeStamps
o -Xloggc:filename
4. 并行收集器设置
o -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
o -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
o -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
5. 并发收集器设置
o -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
o -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

 

 

 

 

 

 

 

 

 

 

 

 

 

jboss内存查看:
1. 用浏览器打开网址:http://IP:port/jmx-console/
2. 找到 jboss.system 一节,或者在 filter 文本框中输入 jboss.system 然后按下 ApplyFilter 按钮
3. 找到 type=ServerInfo 节点并点击进入
4. 找到 listMemoryPools() 方法,点击其下的 Invoke 按钮

一、java.lang.OutOfMemoryError: PermGen space 
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,
它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对
PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小
超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到server/all/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
二、java.lang.OutOfMemoryError: Java heap space
Heap size 设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,
其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可
进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 
解决方法:手动设置Heap size,修改启动参数
JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"
三、实例,以下给出1G内存环境下java jvm 的参数设置参考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
Windows
set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx256m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:MaxNewSize=256m -Dfile.encoding=GBK
echo "JAVA_OPTS="$JAVA_OPTS
Linux
JAVA_OPTS="$JAVA_OPTS -Xms128m -Xmx256m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:MaxNewSize=256m -Dfile.encoding=GBK"
echo "JAVA_OPTS="$JAVA_OPTS

JVM内存JAVA_OPTS参数说明

我经常会这样来设置服务器端的JVM:JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k"

-server:一定要作为第一个参数,在多个CPU时性能佳刘兵召写于2008-12-25 12:40 
-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:java heap最大值,使用的最大内存刘兵召写于2008-12-25 12:40 
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。刘兵召写于2008-12-25 12:40 
-XX:PermSize:设定内存的永久保存区域刘兵召写于2008-12-25 12:40 
-XX:MaxPermSize:设定最大内存的永久保存区域刘兵召写于2008-12-25 12:40 
-XX:MaxNewSize:刘兵召写于2008-12-25 12:40 
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.刘兵召写于2008-12-25 12:40 
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。刘兵召写于2008-12-25 12:40 
-Xss:每个线程的Stack大小刘兵召写于2008-12-25 12:40 
-verbose:gc 现实垃圾收集信息刘兵召写于2008-12-25 12:40 
-Xloggc:gc.log 指定垃圾收集日志文件刘兵召写于2008-12-25 12:40 
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一刘兵召写于2008-12-25 12:40 
-XX:+UseParNewGC :缩短minor收集的时间刘兵召写于2008-12-25 12:40 
-XX:+UseConcMarkSweepGC :缩短major收集的时间刘兵召写于2008-12-25 12:40 
提示:此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。

 

 

 

 

 

 

 

 

 

#free -b -s5

这个命令将会在终端窗口中连续不断地报告内存的使用情况,每5秒钟更新一次。

 

2.使甩vmstat命令监视虚拟内存使用情况 # vmstat

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

1 0 0 63692 10704 101008 0 0 239 42 126 105 48 45 7 0

3.内存泄露的检测和回收

对于内存溢出之类的麻烦,大家可能在编写指针比较多的复杂程序时就会遇到。在Linux或Unix下,C和C++语言是最常使用的工具。但是C++程序缺乏相应的手段来检测内存信息,只能使用top指令观察进程的动态内存总额。而且程序退出时,我们无法获知任何内存泄漏信息。

 

(1)使用Linux命令回收内存,可以使用ps、kill两个命令检测内存使用情况和进行回收。在使用超级用户权限时使用命令“ps”,它会列出所有正在运行的程序名称和对应的进程号(PID)。kill命令的工作原理是向Linux操作系统的内核送出一个系统操作信号和程序的进程号(PID)。

 

下面举例说明,为了高效率回收内存可以使用命令ps参数v: #ps v

PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND

2530 vc/1 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty1

2531 vc/2 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty2

2532 vc/3 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty3

2533 vc/4 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty4

2534 vc/5 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty5

2535 vc/6 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty6

2639 pts/1 S 0:00 545 16 2643 968 0.3 [su]

2684 pts/1 S 0:00 361 586 2501 1592 0.6 bash

2711 pts/0 S 0:00 545 16 2643 968 0.3 [su]

2714 pts/0 S 0:00 361 586 2501 1592 0.6 bash

2754 pts/2 S 0:00 545 16 2643 968 0.3 [su]

2757 pts/2 S 0:00 361 586 2501 1592 0.6 bash

2818 pts/1 S 0:00 120 29 1478 480 0.1 ping 192.168.1.7

2939 pts/2 R 0:00 156 58 2469 644 0.2 ps -v

 

如果想回收ping命令的内存的话,可以使用下面命令:

# kill -9 2818

你可能感兴趣的:(java,jvm,优化,jboss,数据库连接池,compression)