最近在做一个linux平台的项目,第一次接触到性能调优,下面将此过程中的心得和大家分享一下:
测试环境:Linux Suse 4核处理器 单核内存2g 100万数据量的压力下测300个并发 设集合点
数据库:MySql 5.1
1、数据库:
(1)如果查询语句比较多,需要建索引,有必要时要建外键,但是外键影响插入数据的速度,视情况而定;
(2)优化sql语句,查询语句不要用select *,而是只select所需字段;
2、java代码需检查以下项
(1)文件I/O:文件使用后需要close,尽量减少文件读写次数;
(2)字符串拼接:使用StringBuffer构建字符串对象,使用StringBuffer类的append()方法代替使用“+”来拼接字符串;
(3)数组拷贝:使用System.arraycopy()方法代替for循环等循环拷贝的方式;
(4)全局变量:尽量不用session和map做全局变量,java回收局部变量的内存,不回收全局变量的内存;
(5)时间打印:可以在可能执行慢的代码前后加时间打印,分析原因。
//获取精确到毫秒的时间
public static String getMilTime()
{
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String time = sdf.format(date);
return time;
}
3、jni调用
(1)在将java string转换为native string之后,要调用ReleaseStringUTFChars释放。
if (MNull != pszPath && MNull != strJString)
{
env->ReleaseStringUTFChars(strJString, pszPath);
}
(2)用完java传递过来的obj之后,调用(env)->DeleteLocalRef(obj);释放
4、内存监测
(1)tomat——bin——catalina.sh里配置(以4核单核2g共8g内存为例)
export JAVA_OPTS="-Xmx4000M -Xms4000M -Xmn1500M -XX:PermSize=500M -XX:MaxPermSize=500M -Xss256K -XX:+DisableExplicitGC
-XX:SurvivorRatio=6 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log"
内存回收时在catalina.out的日志里会有打印
{Heap before GC invocations=3 (full 0):
par new generation total 1344000K, used 1344000K [0x00000006e6c00000, 0x0000000744800000, 0x0000000744800000)
eden space 1152000K, 100% used [0x00000006e6c00000, 0x000000072d100000, 0x000000072d100000)
from space 192000K, 100% used [0x0000000738c80000, 0x0000000744800000, 0x0000000744800000)
to space 192000K, 0% used [0x000000072d100000, 0x000000072d100000, 0x0000000738c80000)
concurrent mark-sweep generation total 2560000K, used 58068K [0x0000000744800000, 0x00000007e0c00000, 0x00000007e0c00000)
concurrent-mark-sweep perm gen total 512000K, used 37864K [0x00000007e0c00000, 0x0000000800000000, 0x0000000800000000)
172.036: [GC 172.036: [ParNew: 1344000K->192000K(1344000K), 1.3336070 secs] 1402068K->318266K(3904000K), 1.3337350 secs] [Times: user=1.32 sys=0.04, real=1.34 secs]
Heap after GC invocations=4 (full 0):
par new generation total 1344000K, used 192000K [0x00000006e6c00000, 0x0000000744800000, 0x0000000744800000)
eden space 1152000K, 0% used [0x00000006e6c00000, 0x00000006e6c00000, 0x000000072d100000)
from space 192000K, 100% used [0x000000072d100000, 0x0000000738c80000, 0x0000000738c80000)
to space 192000K, 0% used [0x0000000738c80000, 0x0000000738c80000, 0x0000000744800000)
concurrent mark-sweep generation total 2560000K, used 126266K [0x0000000744800000, 0x00000007e0c00000, 0x00000007e0c00000)
concurrent-mark-sweep perm gen total 512000K, used 37864K [0x00000007e0c00000, 0x0000000800000000, 0x0000000800000000)
}
内存回收后的used内存数量是当前程序占用的内存总数;
(2)linux下用top命令可以看内存mem和cpu的占用率,此时的数据是4核的
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21082 root 20 0 69616 7236 4652 S 30 0.1 0:42.64 PPS
3315 root 20 0 181m 33m 7908 S 12 0.6 106:34.25 X
16632 root 20 0 341m 34m 20m S 12 0.6 151:18.11 gnome-system-mo
21038 root 20 0 4914m 2.0g 12m S 10 34.4 1:34.54 java
想看单核的用“shift+h”即可
(3)Load Runner指标:平均请求时间、最大时间、最小时间、90%请求时间(通常作为判断依据,相当于100个用户,有90个用户是在那个标准之下) Transaction Name Minimum Average Maximum Std.Deviation 90 Percent Pass Fail Stop Action_Transaction 0.134 2.756 19.655 0.804 2.842 195,000 0 127 vuser_end_Transaction 0 0 0.002 0 0 300 0 0 vuser_init_Transaction 0 0 0 0 0 300 0 0