[关闭]
@lzb1096101803 2016-03-21T11:47:54.000000Z 字数 2951 阅读 423

Java常用优化策略

电话面试


检测工具

http://www.open-open.com/lib/view/open1390916852007.html
现实企业级Java开发中,有时候我们会碰到下面这些问题:
OutOfMemoryError,内存不足
内存泄露
线程死锁
锁争用(Lock Contention)
Java进程消耗CPU过高

  1. A jps(Java Virtual Machine Process Status Tool):jps主要用来输出JVM中运行的进程状态信息。语法格式如下:
  2. B jstack:jstack主要用来查看某个Java进程内的线程堆栈信息。
  3. CjmapMemory Map)和jhatJava Heap Analysis Tool):jmap用来查看堆内存使用状况,一般结合jhat使用。使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
  4. DjstatJVM统计监测工具)
  5. jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPUJava线程并定位堆栈信息,用到的命令有pstopprintfjstackgrep
  6. jmap -permstat pid
  7. 打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:

代码层面

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优化

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个并发访问

JVM层面

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设成一样大、永久代大小、收集器选择、收集器参数、新生代对象年龄阈值等)

  1. 堆设置
    -Xss128m:JBoss每增加一个线程(thread)就会立即消耗128K,默认值好像是512k.
    -Xms256m:初始堆大小,代表jvm最少用 512m内存
    -Xmx:最大堆大小 一般为服务器的3/4内存量,推荐至少使用4G内存,不应该超过物理内存的90%。
    -XX:NewSize=n:设置年轻代大小
    -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
    -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
    -XX:MaxPermSize=n:设置持久代大小
  2. 收集器设置
    -XX:+UseSerialGC:设置串行收集器
    -XX:+UseParallelGC:设置并行收集器
    -XX:+UseParalledlOldGC:设置并行年老代收集器
    -XX:+UseConcMarkSweepGC:设置并发收集器
  3. 垃圾回收统计信息
    -XX:+PrintGC
    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps
    -Xloggc:filename
  4. 并行收集器设置
    -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
    -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
    -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
  5. 并发收集器设置
    -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
    -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

数据库层面

数据库数据分级存储
将经常访问的数据和访问频度低的数据,分别存放到不同的分区,甚至存放到不同的数据库服务器,以便合进分配硬盘I/O及系统I/O。

如果让你去优化一条 sql 语句,你的思路大概是怎样的?
(1) 查看执行计划
(2) 根据需要进行索引的添加
(3) 根据需要修改 sql,使得尽可能使用索引

(1)将字段很多的表拆分成多个表

有时候有些字段使用频率很低或者字段的数据类型比较大,那么可以考虑垂直拆分的方法,把不常用的字段和大字段拆分出去
不用连接,多次查询

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注