一、内存大小
默认大小:命令 jmap -heap pid
jmap -heap pid
部分值:
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2063597568 (1968.0MB)
NewSize = 42991616 (41.0MB)
MaxNewSize = 687865856 (656.0MB)
OldSize = 87031808 (83.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
堆的默认大小是1968M,不到两个G,新生代656M,老年代83M,这个大小在提取大数据的时候很容易内存溢出,我们默认就碰到了。
新生代和老年代的比例一般设置为1:2 ,基本原则是让新生代设置尽量小一点,让垃圾回收在新生代回收多一点,老年代因为比例比较大,空间比较足,
他的回收次数会稍微少一点,老年代的垃圾回收是MajorGC,也就是Full GC,时间较长;新生代是对象初始的地方,所以会频繁的GC,对象经历多次GC默认是15或者较大的对象会直接到老年代,所以老年代的空间要大一点,默认只有83M,内存必然溢出。
export JAVA_OPTS="-server -Xms3072m -Xmx3072m -Xmn900m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:PermSize=256M -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc_jsb.log -XX:+UseParNewGC -XX:-OmitStackTraceInFastThrow -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5"
-server:因为tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以server模式运行时将拥有:更大、更高的并发处理能力,更快更强的JVM垃圾回收机制,可以获得更多的负载与吞吐量等,所以生产上一般都会用server模式。
-Xms和–Xmx:内存分配值,堆大小,一个是初始值,一个是最大值,一般都要设置为同样大小,因为如果内存达到最大值开始回落到初始值的时候肯定触发了GC机制,老年代区回收内存触发MajorGC,也就是我们说的Full GC 世界暂停,触发Full GC会停止(STW)所有线程去等待GC完成,所以会CPU高速运转,严重的时会感觉到系统卡顿等现象,所以一般设置为一样大小即可。命令java -Xmx2048M -version可以检测你的java支不支持设置2G内存,现在基本都是64位的jdk,所以一般都支持,如果是32位的可能需要检测一下,如果正常显示java版本,说明支持。
-Xmn:新生代大小
-XX:MaxNewSize:新生代占整个堆内存的最大值。
-XX:NewRatio=2 新生代和老年代的比例
-XX:MetaspaceSize=128 #Metaspace是所有线程共享的一块内存区域,主要存放已被虚拟机加载的类定义,方法定义,常量等一些元数据信息,MetaspaceSize 表示的并非是元空间的大小,它的含义是:主要控制matesaceGC发生的初始阈值,也就是最小阈值。也就是说当使用的matespace空间到达了MetaspaceSize的时候,就会触发Metaspace的GC
-XX:MaxMetaspaceSize=512m #MaxMetaspaceSize表示的是保证committed的内存不会超过这个值,一旦超过这个值就会触发GC。注意:在jvm启动的时候,并不会分配MaxMetaspaceSize这么大的一块内存出来,metaspace是可以一直扩容的,直到到达MaxMetaspaceSize;
-XX:PermSize:设置非堆内存初始值,默认是物理内存的1/64。在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。
-XX:MaxPermSize:Perm(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。
-XX:+DisableExplicitGC 在程序代码中不允许有显示的调用”System.gc()
-XX:+UseParNewGC 对年轻代采用多线程并行回收,这样收得快
-XX:+UseConcMarkSweepGC 即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。
XX:MaxTenuringThreshold 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。
这个值,默认是15吧
-XX:CMSFullGCsBeforeCompaction=5 内存导致大量的内存碎片,可以在5次GC之后,做一次Compaction压缩操作
-XX:CMSInitiatingOccupancyFraction=75 老年代带到75%的时候触发内存回收机制
-XX:+UseCMSInitiatingOccupancyOnly 该参数启用后,参数CMSInitiatingOccupancyFraction才会生效。默认关闭。
-Xss:是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory。
-XX:+AggressiveOpts:启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术。
-XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。
-Xloggc:/opt/app/ard-user/ard-user-gc-%t.log 设置日志目录和日志名称
-XX:+UseGCLogFileRotation 开启滚动生成日志
-XX:NumberOfGCLogFiles=5 滚动GC日志文件数,默认0,不滚动
-XX:GCLogFileSize=20M GC文件滚动大小,需开启UseGCLogFileRotation
-XX:+PrintGCDetails 开启记录GC日志详细信息(包括GC类型、各个操作使用的时间),并且在程序运行结束打印出JVM的内存占用情况
-XX:+ PrintGCDateStamps 记录系统的GC时间
-XX:+PrintGCCause 产生GC的原因(默认开启)
二、容器优化
protocol 协议类型,可选类型有4种,BIO(阻塞型IO),NIO,NIO2和APR;BIO(Blocking I/O) 阻塞式I/O操作,Java nio是一个基于缓冲区、非阻塞I/O操作的Java API它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8在Linux系统中默认使用这种方式,如果是7的话需要设置protocol=“org.apache.coyote.http11.Http11NioProtocol”表示使用NIO,org.apache.coyote.http11.Http11Nio2Protocol表示使用NIO2,性能更好吧
URIEncoding=”UTF-8” 使得tomcat可以解析含有中文名的文件的url
maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。
minSpareThreads 最少空闲线程数
executor=“commonThreadPool” 指定线程池
maxThreads :Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数,所以这也决定了QPS的数量。
acceptCount:是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse 、
connectionTimeout:为网络连接超时时间毫秒数。
compression:是否开启JZip压缩
compressionMinSize:压缩处理的最小大小是多少,即包的大小超过这个配置才进行压缩,单位是k,默认是2048
disableUploadTimeout:是否给一些配置为上传的servlet放宽超时时长,单独配置超时时长
maxConnections:最大连接数,一般和maxThreads保持一致
enableLookups ”设置为“false”来关闭DNS 查询。当DNS查询被关闭时,request.getRemoteHost()将返回包含远程客户IP地 址的字符串。
noCompressionUserAgents=“gozilla, traviata” 对于以下的浏览器,不启用压缩
compressableMimeType=“text/html,text/xml” 压缩类型
SSLHostConfig 设置证书,正常不需要设置