您的位置:

java性能优化,Java性能优化实战

本文目录一览:

《Java性能优化权威指南豆瓣》pdf下载在线阅读全文,求百度网盘云资源

《Java性能优化权威指南豆瓣》百度网盘pdf最新全集下载:

链接:

?pwd=vosf 提取码:vosf

简介:《Java性能优化权威指南》是Java应用性能调优的圣经,内容通俗易懂,介绍了大量的监控和测量工具,涉及各种硬件架构和操作系统。涵盖了如何构建实验、解释结果以及如何采取行动等技巧。  

如何优化java虚拟机,提高性能

关于性能调优:

1 需要一个性能探测器,找到调用最频繁的代码段,优化这部分代码(优化算法)

2 往往1%的代码运行时间占99%。所以优化这些代码就能事半功倍。

3 最好是能看懂编译后的代码,这样分析最彻底。

Java的性能分析使用JProfiler

堆栈分析使用的Jstack

Java性能调优 SSH框架优化以适应特定的项目

一、JVM调优

1 各种垃圾回收算法及其优劣;

2 针对不同应用类型如何选择JVM参数

3 常用调优工具的使用(jps/jstat/jmap/jstack/jinfo/jhat)

4 调优案例分析(如何选择不同内存块的大小,如何选择不同的算法来提升性能、响应时间)

二、Java应用中CPU占用率、使用情况分析,线程死锁等锁

系统性能瓶颈的分析定位

1 JStack的深度使用

2 各种Linux监控命令的配合使用(top,vmstat,iostat,sar 不要轻信自己能完全掌控这些命令)、分析

(前一阵Java漏洞通过制造Hash冲突来占尽CPU资源就可以通过top命令快速定位到,你肯定没有这么用过)

3 JProfiler的详细使用

三、Java内存溢出分析

1 用EMA来分析内存占用情况

2 通过案例分析来定位内存泄漏

互联网中的性能主要是两个方面:

1 吞吐量,就是系统支持的访问量。

2 延迟,就是一个请求提交后,相应的时间。

一般硬件不变的情况下,两方面各自优化到极限后,相互会制约,也就是吞吐量增强的话比如需要延迟加大,反之亦然。

Java代码如何优化?从哪些方面入手?分析

1)尽量指定类、方法的final修饰符。带有final修饰符的类是不可派生的,Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,此举能够使性能平均提高50%。

2)尽量重用对象。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此生成过多的对象将会给程序的性能带来很大的影响。

3)尽可能使用局部变量。调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建速度较慢。

4)慎用异常。异常对性能不利,只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。

5)乘法和除法使用移位操作。用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,但是移位操作虽然快,可能会使代码不太好理解,因此最好加上相应的注释。

6)尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用 Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销。

尽量在合适的场合使用单例。使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例。

tomcat 性能调优

java性能优化原则:代码运算性能 内存回收 应用配置(影响java程序注意原因是垃圾回收)

代码层优化:避免过多的循环嵌套 调用和复杂逻辑

Tomcat调优主要内容

1.增加最大连接数

2.调整工作模式

3.启用gzip压缩

4.调整JVM内存大小

5.作为web服务器时 与Apache整合或Nginx

6.合理选择垃圾回收算法

7.尽量使用较新版的JDK

生产环境实例

connector p=""

maxThreads="1000"

minSpareThreads="100"

maxSpareThreads="200"

acceptCount="900"

disableUploadTimeout="true"

connectionTimeout="20000"

URIEncoding="UTF-8"

enableLookups="false"

redirectPort="8443"

compression="on"

compressionMinSize="1024"

compressableMimeType="text/html,text/xml,text/css,text/javascript"/

参数说明:

org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio

maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。

minSpareThreads:最小空闲线程数

maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。

acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。

disableUploadTimeout:禁用上传超时时间

connectionTimeout:连接超时,单位毫秒,0代表不限制

URIEncoding:URI地址编码使用UTF-8

enableLookups:关闭dns解析,提高响应时间

compression:启用压缩功能

compressionMinSize:最小压缩大小,单位Byte

compressableMimeType:压缩的文件类型

Tomcat的三种工作模式: Bio、Nio和Apr 工作原理分别为

Bio(Blocking I/O):默认工作模式 阻塞式I/O操作 没有任何优化技术处理 性能比较低

Nio(New I/O or Non-Blocking):非阻塞式I/O操作 有BIO更好的并发处理性能

Apr(apache portable runtime,apache可移植运行库):首选工作模式 主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库

Tomcat利用基于APR库Tomcat-native来实现操作系统级别控制 提供一种优化技术和非阻塞式I/O操作 大大提高并发处理能力

但是需要安装APR和Tomcat-native库

Java性能问题主要来自于jvm jvm GC也比较复杂

1、jvm内存划分为年轻代(Young Generation)、年老代 Old Generation)、永久代(Permanent Generation)

2、年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认8:2

3、堆内存Heap=年轻代+年老代 非堆内存=永久代

4、堆内存用途:存放的是对象 垃圾收集器就是收集这些对象的 然后根据GC算法回收

5、非堆内存用途:JVM本身使用 存放一些类型 方法 常量 属性等

6、年轻代:新生成的对象首选放到年轻代的E区中 当E区满时 经过GC后 还存活的对象被复制到Survivor区的FromSpace中 如果survivor区满

会再被复制到survivor区的ToSpace区 如果还有存活的对象 会再被复制到老年代

7、老年代:在年轻代中经过GC后还存活的对象会被复制到老年代中 当老年代空间不足时 jvm会对老年代进行完全的垃圾回收(Full GC)

如果GC后 还是无法存放从survivor区复制过来的对象 就会出现OOM

8、永久代:也称为方法区 存放静态类型数据 比如类 方法 属性等

垃圾回收算法

1、标记 清除

2、复制

3、标记 整理

垃圾收集器

单线程/多线程收集器

GMS收集器

JAVA_OPTS="-server -Xms1024m -Xmx1536m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log"

参数 描述

-Xms 堆内存初始大小 单位M、G

-Xmx 堆内存最大允许大小 一般不要大于物理内存的80%

-XX:PermSize 非堆内存初始大小 一般应用设置初始化200M 最大1024M就够了

-XX:MaxPermSize 非堆内存最大允许值

-XX:+UseParallelGCThreads=8 并行收集器线程数 同时有多少个线程进行垃圾回收 一般与CPU数量相等

-XX:+UseParalle101dGC 指定老年代为并行收集

-XX:+UseConcMarkSweepGC CSM收集器

-XX:+UseCMSCCompactAtFullCollection 开启内存空间压缩和整理 防止过多内存碎片

-XX:CMSFullGCsBeforeCompaction=0 表示多少次Full GC后开始压缩和整理 0表示每次Full GC后立即执行压缩和整理

-XX:CMSInitiatingOccupancyFracetion=80% 表示老年代内存空间使用80%时开始执行CMS收集 防止过多的Full GC

注意:不是jvm内存设置越大越好 具体还是根据项目对象实际占内存大小而定 可以通过java自带的分析工具来查看

如果设置过大 会增加回收实际 从而增加暂停应用时间

gzip压缩作用:节省服务器流量和提高网站访问速度 客户端请求服务器资源后 服务器将资源文件压缩 再返回给客户端 有客户端的浏览器负责压缩并浏览

Apache和Tomcat结合

由于Tomcat处理静态文件能力远远不足Apache 所有用Apache处理静态文件 Tomcat负责处理jsp

session会话的保持

TomcatSessionID持久化三种方法

session粘性:通过浏览器cookie绑定sessionID 通过sticky模式将同一session请求分片到同一Tomcat上

session复制:tomcat通过广播形式将session同步到其它Tomcat节点 并且Linux下要手动开启开放广播地址 不宜后端节点过多

session保持数据库(memcache redis):将sessionID保存在共享的数据库中

OOM异常的几个原因

老年代内存不足:java.lang.OutOfMemoryError:Javaheapspace

永久代内存不足:java.lang.OutOfMemoryError:PermGenspace

代码bug 占用内存无法及时回收