SlideShare a Scribd company logo
高性能的Java代码及常见问题排查
bluedavy
http://hellojava.info
Agenda


编写高性能Java代码
◦ 并发
◦ 通信
◦ JVM



Java常见问题排查
编写高性能Java代码


通用技能
◦ 算法
◦ 数据结构



语言相关
◦ 并发
◦ 通信
◦ JVM
编写高性能Java代码


并发
◦ 线程
 创建一个线程到底耗多少内存呢?
 一台机器上到底能创建多少个线程呢?
 常见错误:Unable to create new native thread
编写高性能Java代码


并发
◦ 线程池
 Executors.newCachedThreadPool();
 new ThreadPoolExecutor(10,20,5,TimeUnit.MINUT
ES,new ArrayBlockingQueue<Runnable>(10));

◦ 线程池很容易带来的一些“副问题”
 ThreadLocal累积...
编写高性能Java代码


并发
◦ 线程之间的交互
 wait/notify/notifyAll
 CountDownLatch
 等一组动作完成

 CyclicBarrier
 一组动作一同开始

 Semaphore
 例如连接池类型的场景
编写高性能Java代码


并发
◦锁
 synchronized/ReentrantLock
 java.util.concurrent展示了各种减少锁冲突技术
 CAS
 Atomic*
 例如初始化代码可基于AtomicBoolean做优化
 拆分锁
 ConcurrentHashMap
 读写锁
 Non-Blocking
 通常基于CAS
 ConcurrentLinkedQueue
编写高性能Java代码


一段基于j.u.c的优化代码Case
◦ private Map<String,Object> caches=new HashMap<String,Object>();

◦ public Object getClient(String key,...){
 synchronized(caches){
 if(caches.containsKey(key)){
 return caches.get(key);
}
 else{
 Object value=// create...
 caches.put(key,value);
 return value;
}

 }

◦}
编写高性能Java代码


简单的优化
◦ private Map<String,Object> caches=new HashMap<String,Object>();

◦ public Object getClient(String key,...){
 if(caches.containsKey(key)){
 return caches.get(key);

 }
 else{
 synchronized(caches){
 // double check
 if(caches.containsKey(key)){
 return caches.get(key);
 }
 Object value=// create...
 caches.put(key,value);
 return value;
 }

 }

◦ }
编写高性能Java代码


基于j.u.c的优化
◦

private ConcurrentHashMap<String,FutureTask<Object>> caches=new ConcurrentHashMap<String,
FutureTask<Object>>();

◦ public Object getClient(String key,...){


if(caches.containsKey(key)){




}
else{

 return caches.get(key).get();

 FutureTask<Object> valueTask=new FutureTask<Object>(
 new Callable<Object>(){
 public Object call() throws Exception{
 // create...
 }
 }
 FutureTask<Object> current = caches.putIfAbsent(key, valueTask);
 if(current == null){
 valueTask.run();
 }
 else{
 valueTask = current;
 }
 return valueTask.get();



◦ }

}
编写高性能Java代码


并发
◦ 并发相关的问题
 工欲善其事,必先利其器
 jstack [-l]
 看懂线程dump
 给线程命名很重要

 不太好排查,人脑是串行的...
编写高性能Java代码


并发
◦ 线程不安全造成的问题
 经典的并发场景用HashMap造成cpu 100%的case
 Velocity/Hessian等都犯过的错...

◦ 表象:应用没反应
 死锁
 Spring 3.1.4-版本的deadlock case
 一个static初始化的deadlock case

 处理线程不够用
编写高性能Java代码


通信
◦ 数据库连接池高效吗?
编写高性能Java代码


通信
◦ 基本知识
 BIO/NIO/AIO
 File Zero Transfer
编写高性能Java代码


通信
◦ 典型的nio框架的实现
 netty
编写高性能Java代码


通信
◦ 连接
 长连 Vs 短连
 单个连接 Vs 连接池

◦ 推荐:单个长连接
 容易碰到的问题
 LB

◦ 说说重连
 一个重连设计不好造成的严重故障Case
 连接状态检测
编写高性能Java代码


通信
◦ 高性能Client编写的技巧
 选择一个靠谱的nio框架
 netty

 单个长连接
 反序列化在业务线程里做
 高性能、易用的序列化 /反序列化
 PB

 io线程批量通知
 尽量减少io线程的上下文切换
编写高性能Java代码


通信
◦ 高性能Server编写技巧
 和client基本相同
 业务线程池
 反射method cache
编写高性能Java代码


通信
◦ 通信协议的设计
 版本号
 扩展字段
编写高性能Java代码


通信
◦ 常见问题
 too many open files
 支持超高的并发连接数(10k,100k甚至1000k)
 8 core/8g,轻松支撑15k+

 TIME_WAIT(Client)、CLOSE_WAIT(Server)
 网络通信慢
 send buf/receive buf
 中断处理cpu均衡
 tcpdump抓包分析
编写高性能Java代码


JVM
◦ 代码的执行
 编写源码时编译为bytecode
 启动后先解释执行
 C1/C2编译
 经典的编译优化,相较静态而言更为高效
 static final值
 inline
 条件分支预测等
 EA

 TieredCompilation
编写高性能Java代码


JVM
◦ 代码的执行
 编写正确的MicroBenchMark
 Warm
 -XX:+PrintCompilation
编写高性能Java代码


JVM
◦ 代码的执行
 传说中的大方法性能更差
 是有道理的

◦ 一个性能狂降的case
 CodeCache is full. Compiler has been disabled
编写高性能Java代码


JVM
◦ 内存管理
 内存区域划分
Java Heap(-Xms -Xmx)

C Heap
Reserved
CodeCache

Object
Struc data

-XX:ReservedCodeCacheSize

Direct
Memory

Method
Stack

-XX:MaxDirectMemorySize
-Xss

...

Perm Gen
-XX:PermSize
-XX:MaxPermSize

Eden

Survivor

NewGen
(-Xmn -XX:SurvivorRatio)

Survivor

OldGen
编写高性能Java代码


JVM
◦ 内存管理
 GC(Garbage Collector):负责内存的分配和回
收
 Serial
 server端基本不用
 Parallel
 Concurrent
 G1GC
编写高性能Java代码


JVM
◦ 内存管理
 Parallel GC
 Stop-The-World(STW)
 回收时多线程执行
 -XX:ParallelGCThreads
 YoungGen采用Copy算法实现,Full采用Mark-Compact算
法实现
 有两种可使用
 -XX:+UseParallelGC(Server VM默认)
 -XX:+UseParallelOldGC(优化版本)
编写高性能Java代码


JVM
◦ 内存管理
 Parallel GC
 相关参数
 -XX:SurvivorRatio(默认无效),原因是...
 -XX:MaxTenuringThreshold (默认无效),原因同上;
 -XX:-UseAdaptiveSizePolicy
 -XX:ParallelGCThreads
编写高性能Java代码


JVM
◦ 内存管理
 Concurrent GC
 简称CMS
 新生代ParNew(Copy算法),旧生代CMS(采用
Mark-Sweep算法),Full采用Serial
 Mostly Concurrent
 分为CMS-initial-Mark、CMS-concurrent-mark、CMSconcurrent-preclean、CMS-remark、CMS-concurrentsweep、CMS-concurrent-reset
 其中CMS-initial-Mark、CMS-remark为STW;
 -XX:+UseConcMarkSweepGC
编写高性能Java代码


JVM
◦ 内存管理
 Concurrent GC
 相关参数
 -XX:SurvivorRatio
 -XX:MaxTenuringThreshold
 -XX:CMSInitiatingOccupancyFraction
 -XX:CMSInitiatingPermOccupancyFraction
 -XX:+UseCMSInitiatingOccupancyOnly
编写高性能Java代码


JVM
◦ 内存管理
 G1GC
 6u23以后支持,不过目前还不成熟...
编写高性能Java代码


JVM
◦ 内存管理
 java.lang.OutOfMemoryError: {reason}







GC overhead limit exceeded
Java Heap Space
Unable to create new native thread
PermGen Space
Direct buffer memory
request {} bytes for {}. Out of swap space?
编写高性能Java代码


JVM
◦ 内存管理
 工欲善其事,必先利其器
 ps
 -XX:+PrintGCDateStamps –XX:+PrintGCDetails –Xloggc:<gc
文件位置>
 -XX:+PrintFlagsFinal(6u21+)
 -XX:+HeapDumpOnOutOfMemoryError
 jinfo -flag
 jstat
 jmap
 MAT
 btrace
 google perf-tools
编写高性能Java代码


JVM
◦ 内存管理
 OOM
 GC overhead limit exceeded || Java Heap Space
 首先要获取到heap dump文件
 -XX:+HeapDumpOnOutOfMemoryError
 jmap –dump:file=<>,format=b [pid]
 from core dump
 接下去的解决步骤
 Cases show
编写高性能Java代码
编写高性能Java代码


JVM
◦ 内存管理
 OOM
 比较难排查的java heap space oom Case...
 两种...
编写高性能Java代码


JVM
◦ 内存管理
 OOM
 PermGen Space
 PermSize小了
 ClassLoader使用不当
 经典的Groovy Case
 排查方法
 -XX:+TraceClassLoading
 btrace
编写高性能Java代码


JVM
◦ 内存管理
 OOM
 Direct buffer memory
 -XX:MaxDirectMemorySize
 只有ByteBuffer.allocateDirect这里有可能抛出
 排查起来不会太复杂
编写高性能Java代码


JVM
◦ 内存管理
 OOM
 request {} bytes for {}. Out of swap space?
 只有Java crash才会看到:hs_err_pid[$pid].log
 原因可能是
 地址空间不够用
 32 bit
 C Heap内存泄露
 google perf-tools
 经典的Inflater/Deflater Case
 Direct ByteBuffer Case
编写高性能Java代码


JVM
◦ 内存管理
 GC调优
 到底什么算GC频繁?
 怎么选择GC?
 为什么heap size<=3G下不建议采用CMS GC?
编写高性能Java代码


JVM

◦ 内存管理
 GC调优Cases
 通常是明显的GC参数问题
 CMS GC
 触发比率设置不合理导致CMS GC频繁的case
 -Xmn设置不合理导致CMS-remark时间长的case
 swap case
 promotion failed cases
 大对象分配
 碎片
 Parallel GC
 Survivior区域大小调整的case
 悲观策略造成GC频繁的case
编写高性能Java代码


JVM
◦ 内存管理
 编写GC友好的代码







限制大小的集合对象;
避免Autobox;
慎用ThreadLocal;
限制提交请求的大小,尤其是批量处理;
限制数据库返回的数据数量;
合理选择数据结构。
Java常见问题排查
类加载问题
 CPU高
 内存问题
 Java进程退出




知其因 + 经验
Java常见问题排查


类加载问题
◦
◦
◦
◦

ClassNotFoundException
NoClassDefFoundError
ClassCastException
一个集群里有部分node成功、部分node失败的
case
 Java应用在linux环境下的常见问题...

◦ 重要工具
 -XX:+TraceClassLoading
 上面参数不work的时候btrace
Java常见问题排查


CPU高
◦ us高
 特殊字符串引起的系统us高的case





top –H
将看到的pid做十六进制转化
jstack | grep nid=0x上面的值,即为对应的处理线程
btrace看看有哪些输入的字符串
Java常见问题排查


CPU高
◦ us高
 一行代码引发的杯具
 public class CustomException extends Exception{

private Throwable cause;

public Throwable getCause(){

return cause;

}
}
Java常见问题排查


CPU高
◦ us高
 还有可能
 top,then 1如看到一直是其中一个cpu高,有可能会是gc问
题,看看gc log

◦ 最麻烦的case是cpu使用比较平均,每个线
程耗一些,而且是动态的...
Java常见问题排查


CPU高
◦ us高
 一个诡异的cpu us消耗的case
Java常见问题排查


CPU高
◦ sy高
 线程上下文切换会造成sy高
 线程多
 一个误用netty client造成sy高的case
 锁竞争激烈
 主动的切换
 一个Case...
 linux 2.6.32高精度定时器引发的sy高case
Java常见问题排查


CPU高
◦ iowait高
 一个iowait高的排查case
 工具
 硬件
Java常见问题排查


Java进程退出
◦
◦
◦
◦

原因非常的多
首先要确保core dump已打开
dmesg
crash demo
 jinfo -flag FLSLargestBlockCoalesceProximity <pid>
Java常见问题排查


Java进程退出
◦ native stack溢出导致java进程退出的case
◦ 编译不了某些代码导致的Java进程退出的
case
XX:CompileCommand=exclude,the/package/and/Cl
ass,methodName

◦ 内存问题导致的进程退出的case
◦ JVM自身bug导致退出的case
参考资料
Java代码的执行
 学习JVM的References
 Building memory-efficient Java
Applications
 Achieving Rapid Response Times in Large
Online Services
 highscalability.com
 Research at Google
 Facebook Engineering

推荐书籍
《Java并发编程实战》
《Programming Concurrency on the JVM》
《JRockit: The Definitive Guide》
《The Garbage Collection Handbook》
《Memory Systems》
《Fundamental Networking in Java》
《Pro (IBM) WebSphere Application Server 7
Internals》
 《虚拟机:系统与进程的通用平台》
 《What every programmer should know about
memory》
 《Java Performance》








More Related Content

PPTX
Java常见问题排查
PPTX
Sun jdk 1.6内存管理 -使用篇
PPTX
并发编程交流
PDF
Java线上应用问题排查方法和工具(空望)
PPTX
Sun JDK 1.6内存管理 -调优篇
PPTX
Java内存管理问题案例分享
PPTX
HBase@taobao for 技术沙龙
PPT
JVM内容管理和垃圾回收
Java常见问题排查
Sun jdk 1.6内存管理 -使用篇
并发编程交流
Java线上应用问题排查方法和工具(空望)
Sun JDK 1.6内存管理 -调优篇
Java内存管理问题案例分享
HBase@taobao for 技术沙龙
JVM内容管理和垃圾回收

What's hot (20)

PPT
C1000K高性能服务器构建技术
PPTX
线上问题排查交流
PPT
Effective linux.3.(diagnosis)
PDF
JVM及其调优
PPTX
Jvm基础调优实践(v1.0)
PPT
Jvm内存管理基础
PPTX
Java Crash分析(2012-05-10)
PDF
Btrace intro(撒迦)
PPT
Lamp优化实践
PDF
Mysql fast share
PDF
Lamp高性能设计
PPTX
Ali-tomcat
PDF
Golang 高性能实战
PDF
Sun jdk 1.6内存管理 -使用篇-毕玄
PPT
Aswan&hump
PDF
Java cpu
PDF
高性能LAMP程序设计
PDF
MongoDB at Qihoo 360
PPT
Exodus2 大局观
PPTX
Sun jdk 1.6 gc
C1000K高性能服务器构建技术
线上问题排查交流
Effective linux.3.(diagnosis)
JVM及其调优
Jvm基础调优实践(v1.0)
Jvm内存管理基础
Java Crash分析(2012-05-10)
Btrace intro(撒迦)
Lamp优化实践
Mysql fast share
Lamp高性能设计
Ali-tomcat
Golang 高性能实战
Sun jdk 1.6内存管理 -使用篇-毕玄
Aswan&hump
Java cpu
高性能LAMP程序设计
MongoDB at Qihoo 360
Exodus2 大局观
Sun jdk 1.6 gc
Ad

Viewers also liked (20)

PPTX
Git 实战
PDF
Inside Erlang Vm II
PPT
Erlang及其应用
PPT
Erlang高级原理和应用
PDF
Taobao图片存储与cdn系统到服务
PPTX
Linux内存管理
PPTX
Linux内存管理
PDF
LVS development and experience
PPTX
Java memory problem cases solutions
PDF
鹰眼下的淘宝_EagleEye with Taobao
PDF
VMIL keynote : Lessons from a production JVM runtime developer
PDF
账务系统设计及应用
KEY
Python在豆瓣的应用
PPTX
Erlang分布式系统的的领域语言
PPTX
Redis原生命令介绍
PPTX
Implementing a JavaScript Engine
PDF
分布式Key Value Store漫谈
PDF
Strata Beijing - Deep Learning in Production on Spark
PDF
沒有 GUI 的 Git
Git 实战
Inside Erlang Vm II
Erlang及其应用
Erlang高级原理和应用
Taobao图片存储与cdn系统到服务
Linux内存管理
Linux内存管理
LVS development and experience
Java memory problem cases solutions
鹰眼下的淘宝_EagleEye with Taobao
VMIL keynote : Lessons from a production JVM runtime developer
账务系统设计及应用
Python在豆瓣的应用
Erlang分布式系统的的领域语言
Redis原生命令介绍
Implementing a JavaScript Engine
分布式Key Value Store漫谈
Strata Beijing - Deep Learning in Production on Spark
沒有 GUI 的 Git
Ad

Similar to 高性能的Java代码编写及常见问题排查 (20)

PPTX
Java常见问题排查
PDF
Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)
PPT
Node.js在淘宝的应用实践
PDF
05.wls调优
PPTX
为啥别读HotSpot VM的源码(2012-03-03)
PDF
Youku arch qcon2009_beijing
PDF
优酷 Web网站架构案例分析
PDF
Key value store
PPTX
Java bytecode
PDF
Jvm独家剖析
PDF
D2_node在淘宝的应用实践_pdf版
PPT
Jvm状态监控与oom案例分析
PPT
高性能Lamp程序设计 付超群
PPTX
高性能队列Fqueue的设计和使用实践
PPTX
網路技術心得分享
PPTX
高性能远程调用解决方案
PDF
How do we manage more than one thousand of Pegasus clusters - backend part
PDF
谈谈缓存
PPTX
Proxmox 5.0
PPTX
Node js feat pegasus
Java常见问题排查
Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)
Node.js在淘宝的应用实践
05.wls调优
为啥别读HotSpot VM的源码(2012-03-03)
Youku arch qcon2009_beijing
优酷 Web网站架构案例分析
Key value store
Java bytecode
Jvm独家剖析
D2_node在淘宝的应用实践_pdf版
Jvm状态监控与oom案例分析
高性能Lamp程序设计 付超群
高性能队列Fqueue的设计和使用实践
網路技術心得分享
高性能远程调用解决方案
How do we manage more than one thousand of Pegasus clusters - backend part
谈谈缓存
Proxmox 5.0
Node js feat pegasus

高性能的Java代码编写及常见问题排查