@lzb1096101803
2016-03-21T11:47:54.000000Z
字数 2951
阅读 425
电话面试
http://www.open-open.com/lib/view/open1390916852007.html
现实企业级Java开发中,有时候我们会碰到下面这些问题:
OutOfMemoryError,内存不足
内存泄露
线程死锁
锁争用(Lock Contention)
Java进程消耗CPU过高
A、 jps(Java Virtual Machine Process Status Tool):jps主要用来输出JVM中运行的进程状态信息。语法格式如下:
B、 jstack:jstack主要用来查看某个Java进程内的线程堆栈信息。
C、jmap(Memory Map)和jhat(Java Heap Analysis Tool):jmap用来查看堆内存使用状况,一般结合jhat使用。使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
D、jstat(JVM统计监测工具)
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。
jmap -permstat pid
打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:
0.加入缓存
1、生成对象时,合理分配空间和大小
new ArrayList(100);
2、优化for循环
int size = vect.size();
for( int i=0; i>size; i++){
...
}
3.设置session过期时间
conf\web.xml中通过参数指定:
<session-config>
<session-timeout>180</session-timeout>
</session-config>
单位为分钟。
Tomcat 默认可以使用的内存为 128MB
set JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为 256MB ,可以使用的最大内存为 512MB
tomcat内存优化
linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"
windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m
最大堆内存是1024m,对于现在的硬件还是偏低,实施时,还是按照机器具体硬件配置优化。
tomcat 线程优化
connectionTimeout="20000" redirectPort="8443" />
maxThreads="600" ///最大线程数
minSpareThreads="100"///初始化时创建的线程数
maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
但是tomcat 最多支持500个并发访问
GC的时间足够的小
GC的次数足够的少
发生Full GC的周期足够的长
java -Xmx3550m -Xms3550m -Xmn2g –Xss128k
-Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
http://www.importnew.com/13954.html
G1
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
在JDK6中这两个参数必须同时使用
如何优化jvm参数(堆大小、xmx一般和xms设成一样大、永久代大小、收集器选择、收集器参数、新生代对象年龄阈值等)
数据库数据分级存储
将经常访问的数据和访问频度低的数据,分别存放到不同的分区,甚至存放到不同的数据库服务器,以便合进分配硬盘I/O及系统I/O。
如果让你去优化一条 sql 语句,你的思路大概是怎样的?
(1) 查看执行计划
(2) 根据需要进行索引的添加
(3) 根据需要修改 sql,使得尽可能使用索引
(1)将字段很多的表拆分成多个表
有时候有些字段使用频率很低或者字段的数据类型比较大,那么可以考虑垂直拆分的方法,把不常用的字段和大字段拆分出去
不用连接,多次查询