java代码与常见问题排查

上传人:ji****en 文档编号:107706203 上传时间:2019-10-20 格式:PDF 页数:74 大小:1,011.29KB
返回 下载 相关 举报
java代码与常见问题排查_第1页
第1页 / 共74页
java代码与常见问题排查_第2页
第2页 / 共74页
java代码与常见问题排查_第3页
第3页 / 共74页
java代码与常见问题排查_第4页
第4页 / 共74页
java代码与常见问题排查_第5页
第5页 / 共74页
点击查看更多>>
资源描述

《java代码与常见问题排查》由会员分享,可在线阅读,更多相关《java代码与常见问题排查(74页珍藏版)》请在金锄头文库上搜索。

1、1 高性能的Java代码及常见问题排查 林昊 http:/hellojava.info 2 参考资料 Java代码的执行 学习JVM的References Building memory-efficient Java Applications Achieving Rapid Response Times in Large Online Services Research at Google Facebook Engineering 3 推荐书籍 Java并发编程实战 Programming Concurrency on the JVM JRockit: The Definitive Guide

2、 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 4 Agenda 编写高性能Java代码 并发 通信 JVM Java常见问题排查 典型的互联网技术 5 编写高性能Java代码 通用技能 算法 数据结构 语言相关 并发 通信 JV

3、M 6 编写高性能Java代码 并发 线程 创建一个线程到底耗多少内存呢? 一台机器上到底能创建多少个线程呢? 常见错误:Unable to create new native thread 7 编写高性能Java代码 并发 线程池 Executors.newCachedThreadPool(); new ThreadPoolExecutor(10,20,5,TimeUnit.MINUT ES,new ArrayBlockingQueue(10); 线程池很容易带来的一些“副问题” ThreadLocal累积. 8 编写高性能Java代码 并发 线程之间的交互 wait/notify/noti

4、fyAll CountDownLatch 等一组动作完成 CyclicBarrier 一组动作一同开始 Semaphore 例如连接池类型的场景 9 编写高性能Java代码 并发 锁 synchronized/ReentrantLock java.util.concurrent展示了各种减少锁冲突技术 CAS Atomic* 例如初始化代码可基于AtomicBoolean做优化 拆分锁 ConcurrentHashMap 读写锁 Non-Blocking 通常基于CAS ConcurrentLinkedQueue 10 编写高性能Java代码 一段基于j.u.c的优化代码Case privat

5、e Map caches=new HashMap(); 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; 11 编写高性能Java代码 简单的优化 private Map caches=new HashMap(); public Object getClient(String key,.) if(c

6、aches.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; 12 编写高性能Java代码 基于j.u.c的优化 private ConcurrentHashMap caches=new ConcurrentHashMap(); public Object get

7、Client(String key,.) if(caches.containsKey(key) return caches.get(key).get(); else FutureTask valueTask=new FutureTask( new Callable() public Object call() throws Exception / create. FutureTask current = caches.putIfAbsent(key, valueTask); if(current = null) valueTask.run(); else valueTask = current

8、; return valueTask.get(); 13 编写高性能Java代码 并发 并发相关的问题 工欲善其事,必先利其器 jstack -l 看懂线程dump 给线程命名很重要 不太好排查,人脑是串行的. 14 编写高性能Java代码 并发 线程不安全造成的问题 经典的并发场景用HashMap造成cpu 100%的case Velocity/Hessian等都犯过的错. 表象:应用没反应 死锁 Spring 3.1.4-版本的deadlock case 一个static初始化的deadlock case 处理线程不够用 15 编写高性能Java代码 通信 数据库连接池高效吗? 16 编写

9、高性能Java代码 通信 基本知识 BIO/NIO/AIO File Zero Transfer 17 编写高性能Java代码 通信 典型的nio框架的实现 netty 18 编写高性能Java代码 通信 连接 长连 Vs 短连 单个连接 Vs 连接池 推荐:单个长连接 容易碰到的问题 LB 说说重连 一个重连设计不好造成的严重故障Case 连接状态检测 19 编写高性能Java代码 通信 高性能Client编写的技巧 选择一个靠谱的nio框架 netty 单个长连接 反序列化在业务线程里做 高性能、易用的序列化 /反序列化 PB io线程批量通知 尽量减少io线程的上下文切换 20 编写高性

10、能Java代码 通信 高性能Server编写技巧 和client基本相同 业务线程池 反射method cache 21 编写高性能Java代码 通信 通信协议的设计 版本号 扩展字段 22 编写高性能Java代码 通信 常见问题 too many open files 支持超高的并发连接数(10k,100k甚至1000k) 8 core/8g,轻松支撑15k+ TIME_WAIT(Client)、CLOSE_WAIT(Server) 网络通信慢 send buf/receive buf 中断处理cpu均衡 tcpdump抓包分析 23 编写高性能Java代码 JVM 代码的执行 编写源码时编

11、译为bytecode 启动后先解释执行 C1/C2编译 经典的编译优化,相较静态而言更为高效 static final值 inline 条件分支预测等 EA TieredCompilation 24 编写高性能Java代码 JVM 代码的执行 编写正确的MicroBenchMark Warm -XX:+PrintCompilation 25 编写高性能Java代码 JVM 代码的执行 传说中的大方法性能更差 是有道理的 一个性能狂降的case CodeCache is full. Compiler has been disabled 26 编写高性能Java代码 JVM 内存管理 内存区域划分

12、 Reserved CodeCache Object Struc data Method Stack C Heap Perm Gen Eden Survivor Survivor OldGen Direct Memory Java Heap(-Xms -Xmx) -XX:PermSize -XX:MaxPermSize NewGen (-Xmn -XX:SurvivorRatio) -XX:ReservedCodeCacheSize -XX:MaxDirectMemorySize -Xss . 27 编写高性能Java代码 JVM 内存管理 GC(Garbage Collector):负责内存

13、的分配和回 收 Serial server端基本不用 Parallel Concurrent G1GC 28 编写高性能Java代码 JVM 内存管理 Parallel GC Stop-The-World(STW) 回收时多线程执行 -XX:ParallelGCThreads YoungGen采用Copy算法实现,Full采用Mark-Compact算 法实现 有两种可使用 -XX:+UseParallelGC(Server VM默认) -XX:+UseParallelOldGC(优化版本) 29 编写高性能Java代码 JVM 内存管理 Parallel GC 相关参数 -XX:Surviv

14、orRatio(默认无效),原因是. -XX:MaxTenuringThreshold (默认无效),原因同上; -XX:-UseAdaptiveSizePolicy -XX:ParallelGCThreads 30 编写高性能Java代码 JVM 内存管理 Concurrent GC 简称CMS 新生代ParNew(Copy算法),旧生代CMS(采用 Mark-Sweep算法),Full采用Serial Mostly Concurrent 分为CMS-initial-Mark、CMS-concurrent-mark、CMS- concurrent-preclean、CMS-remark、CMS-concurrent- sweep、CMS-concurrent-reset 其中CMS-initial-Mark、CMS-remark为STW; -XX:+UseConcMarkSweepGC 31 编写高性能Java代码 JVM 内存管理 Concurrent GC 相关参数 -XX:SurvivorRatio -XX:MaxTenuringThreshold -XX:CMSInitiatingOccupancyFraction -XX:CMSInitiatingPermOccupancyFraction -XX:+UseCMSInitiatingOccup

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号