java调优fullgc_Java性能调优 - SmartMeow的个人空间 - OSCHINA - 中文开源技术交流社区...

线程分析

cat /proc/[pid]/status : 查看进程信息,如进程使用总线程数

Context Switch Definition 上下文切换定义:http://www.linfo.org/context_switch.html

context是指CPU寄存器和程序计数器在任何时间点的内容,CS可以描述为kernel执行下面的操作:1. 挂起一个进程,并储存该进程当时在内存中所反映出的状态;  2. 从内存中恢复下一个要执行的进程,恢复该进程原来的状态到寄存器,返回到其上次暂停的执行代码然后继续执行。

linux内核中不区分进程和线程,linux中一个进程/线程的时间片到期,或是有更高优先级的进程/线程抢占时,是会发生CS的,但这些都是我们应用开发者不可控的。那么我们不妨更多地从应用开发者(user space)的角度来看这个问题,我们的进程可以主动地向内核申请进行CS,而用户空间通常有两种手段能达到这一“目的”:1)休眠当前进程/线程  2)唤醒其他进程/线程

vmstat 1 : 查看cpu使用情况/1秒

cs列表示每秒上下文切换次数,us表示用户CPU时间

pidstat -p [pid] 1 : 查看进程cpu使用情况/1秒

pidstat -w -p [pid] 1 : 查看进程cpu上下文切换情况/1秒

cswch/s: 每秒任务主动(自愿的)切换上下文的次数,当某一任务处于阻塞等待时,将主动让出自己的CPU资源。

nvcswch/s: 每秒任务被动(不自愿的)切换上下文的次数,CPU分配给某一任务的时间片已经用完,因此将强迫该进程让出CPU的执行权。

线程数过多可能导致cpu空耗在线程上下文切换中,降低系统性能。

堆栈分析

top : 查看进程使用情况

top -H : 查看线程使用情况

jstack [pid] >> j.out : 输出堆栈信息

通过top -H查到cpu占用高的线程号,十进制的线程号转十六进制后,在jstack信息中查找对应线程堆栈进行分析。

GC分析

JVM GC是JVM的内存回收算法,调整JVM GC(Garbage Collection),可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。

JDK8以前,Java堆由Perm区和Heap区组成,Heap区由Old区和New区(也叫Young区)组成,New区由Eden区、From区和To区(Survivor)组成;JDK8后metaSpace取代permGen,permGen位于JVM内存的非堆内存,会引发永久代OutOfMemory问题,而metaSpace位于本地内存,不再占用JVM内存。

Eden区用于存放新生成的对象。Eden中的对象生命不会超过一次Minor GC。

Survivor区有两个,存放每次垃圾回收后存活的对象,即S0和S1。

Old区,也称老生代,主要存放应用程序中生命周期长的存活对象PermSize和MaxPermSize指明虚拟机为java永久生成对象(Permanate generation)如,class对象、方法对象这些可反射(reflective)对象分配内存限制,这些内存不包括在Heap(堆内存)区之中。

jstat -gcutil [pid] 3000 : 查看进程GC信息/3秒

S0:年轻代中第一个survivor(幸存区)已使用容量占当前容量百分比

S1:年轻代中第二个survivor(幸存区)已使用容量占当前容量百分比

E:年轻代中Eden(伊甸园)已使用容量占当前容量百分比

O:老年代已使用的占当前容量百分比

P:永久代已使用的占当前容量百分比

YGC:年轻代(young gc)gc次数

YGCT:年轻代(young gc)gc所用时间(s)

FGC:老年代(full gc)gc次数

FGCT:老年代(full gc)gc所用时间(s)

GCT:gc用的总时间(s)

Java 堆分为新生代和老年代,新生代一般划分为三块区域,Eden + From Survivor + To Survivor,Eden 和 Survivor 的内存比为8:1,每次只使用一个Eden 和一个 Survivor 区域,另一个 Survivor 用于复制收集算法回收内存。

对象一般尽量分配到新生代中,而对于大对象(长字符串和大数组)直接分配在老年代中,同时“年龄”长的的对象会从新生代自动晋升到老年代中。

Java 方法区称为永久代,只有 HotSpot 虚拟机才存在永久代。

当 Eden 区域分配不足时,自动发生一次 Minor GC。

当发生 Minor GC 时,虚拟机会自动检测(比较)新生代晋升到老年代的对象内存大小和老年代剩余内存大小,如果晋升>剩余,则发生一次Full GC;如果晋升

JVM的调优应减少fullGC的次数,因为fullGC会暂停程序比较长的时间,如果fullGC的次数比较多,程序就会经常性的假死。

磁盘IO

vmstat -d

iostat -d 1

流量监控

Socket连接

netstat -an | grep [port]

java启动参数调优

-Xms4g

JVM最小可用内存大小,默认值为机器最大内存的1/64,一般设置Xms=Xmx,避免垃圾回收后JVM重新分配内存引起的内存抖动

-Xmx4g

JVM最大可用内存大小,默认值为机器最大内存的1/4或1g(较小者),内存超出Xmx大小触发FullGC

-Xmn2G

年轻代大小,一般设置为堆内存的3/8

-Xss256k

每个线程的堆栈大小,默认1024k,内存不存情况下,减小线程堆栈大小可允许生成更多线程

-XX:MetaspaceSize=

默认初始大小=20.75M,metaSpace扩容时触发FullGC的阈值,每次扩容后metaSpace再次达到新阈值时会再次触发FullGC,因此一般配置MetaspaceSize=MaxMetaspaceSize,8G内存机器可配置为256M

-XX:MaxMetaspaceSize=

默认值=无限大,metaSpace的大小超过这个值时触发FullGC

-XX:+UseParallelGC

-XX:ParallelGCThreads=3 : 并行GC使用线程数,一般为cpu核数3/4

-XX:+UseParallelOldGC

-XX:+UseConcMarkSweepGC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值