Java系统程序Bug解决方法论(一) - 教程简介
对于系统地介绍Java问题定位类的教程少之又少,即使有这方面的内容,往往也是一笔带过。本教程系统地介绍Java问题定位技术,我相信有一些很少公开的定位技术,在正确使用时,可以产生令人惊讶的效果。
采用Java开发的大型应用系统越来越大、越来越复杂;很多系统甚至是将很多第三方系统 集成在一起,整个系统看起来像一个黑盒子。系统运行遭遇问题(系统停止响应,运行越来越 慢,或者性能低下,甚至系统core dump),如何迅速命中问题的根本原因是颇具挑战性的任务。 这类问题的定位技巧是本文介绍的重点,借助这些技巧可以快速找到这些问题的突破口。
功能性的问题定位往往有很清晰的套路(如单步跟踪等),对此不做介绍。着重介绍稳定性和可靠性方面的问题定位技术,特别是那些在实验室难以发现的深层次的问 题。将Java问题定位的方法体系化,提供一种以黑盒子方式进行问题定位的思路:如何使 用线程堆栈进行性能瓶颈分析?如何分析内存泄漏?如何分析系统挂死?在掌握所介绍的方法后,很多情况下无需对系统了解就可以对这类问题进行定位。
对于可靠性和稳定性等非功能需求很多时候难以验证,我们不可能写出"万能的"测试用
例来发现系统所有的可靠性和稳定性问题,所以非功能特性缺陷带来的灾难和难以验证的特 点需要我们采取一切可能的办法进行提前预防,将非功能性需求表现在代码中,是一个优秀 程序工程师的功底的一个体现。因此除了介绍"事后"定位技术以外,同时还介绍了大量 的事前预防技术,对一些严重影响稳定性或者可靠性问题相关的陷阱进行了深入分析,它们正 是大型系统容易忽略但对系统稳定性和可靠性有巨大影响的暗礁,如果能在系统的设计和编 码阶段就防止埋上这些"地雷",那么就不需要事后补救这种代价极高的维护成本。
旨在让软件能表现出"工业强度",即一个"产品级别"的软件,“产品级别"与"功能完 备"是完全不同的两个概念。验收测试的通过与系统能否承受实际应用中的压力完全是两回 事。经过验收测试的系统有可能在真实的环境下表现得一塌糊涂,也有可能非常地棒。举个例 子,我们能保证不存在内存泄漏吗?没人会在测试服务器中在完全模拟实际的负载的情况下 对系统进行一个周或者一个月的测试。因此,通过QA并不能保证没有内存泄漏的发生,因此 它很容易就被带入到产品中。内存泄漏情况大多是与流量相关的,也就是说,流量越大,内存 泄漏的速度就越快。这意味着你根本无法预测什么时候要重启程序,问题往往发生在系统最 忙的时候,墨菲法则往往就在这个时候生效。“产品级别"的另一个方面是系统对所谓"瞬时峰 值"的应对能力,也就是应对系统的短暂性冲击的能力。经过短暂峰值的冲击的系统能否自动 恢复?很多系统经过短暂的峰值冲击,往往不能恢复,这常常是由于异常情况没有很好地进 行"善后处理”,导致大量资源泄漏,比如数据库连接泄露,一旦衰退开始,系统崩溃就只是迟 早的问题了。要想将功能完备软件变为产品级软件,系统要有一套完整的异常处理机制,对异 常进行了合适的"善后处理”,避免由于异常导致的资源泄漏等问题。对这些具有坏味道的代码也进行了深入剖析
介绍的定位技术主要有:内存泄漏定位,线程堆栈分析等。内存定位套路比较固定, 但线程堆栈分析需要一定的火候,它需要一定的悟性和长期的修炼。在可靠性和稳定性问题的定位中,线程堆栈分析是最有力的武器,掌握了这个定位工具,会大大增强自己的"内功"。
本教程适宜人群
- 开发的应用属于7*24的应用,并要求99.999%(俗称5个9)的高稳定性高可靠性
- 开发的应用属于大型应用,每个人只熟悉系统的一小部分
对下面一些问题模糊不清的开发人员
- 将不用的对象设为null,就可以避免内存泄漏
- 由于JVM自动进行内存管理,因此java中不会有内存泄漏
- unix/linux下使用top观察到内存上升,可以断定程序存在内存泄漏
- 线程不安全的HashMap并发读是不会出现问题的. – 字符集和字符编码的关系
- “系统挂死”、"宕机"感觉比较抽象
- 负责对系统进行优化维护的开发人员
- 致力于开发大型可靠系统的开发人员
Java系统程序Bug解决方法论(一) - 教程简介相关推荐
- Java服务器宕机解决方法论
文章收录在我的 GitHub 仓库,欢迎Star/fork: Java-Interview-Tutorial https://github.com/Wasabi1234/Java-Interview- ...
- ebs java并发_EBS中Java并发程序笔记(1)
在Oracle EBS中的Java并发程序(Java Concurrent Program)是系统功能中的一个亮点,它的出现使得用户可以在ERP系统中运行自己定义的Java程序.本文为学习笔记,所以不 ...
- EBS中Java并发程序笔记(1)
在Oracle EBS中的Java并发程序(Java Concurrent Program)是系统功能中的一个亮点,它的出现使得用户可以在ERP系统中运行自己定义的Java程序.本文为学习笔记,所以不 ...
- [Google API](8)构建使用Google API的Java应用程序
Google 搜索引擎建立起了通过 Web 服务接口可用的索引.拼写建议和缓存页面,从而允许所有语言的程序员都能就个人使用存取信息.Google 搜索引擎还提供了 Java API,从而存取数据更为便 ...
- 解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法...
在 GTK+/GNOME 3 环境下采用默认的 Adwaita 主题时,Java Swing 程序如果使用本地 GTK+ 主题会出现菜单无边框的 bug,这个问题也可能在其他常用的 GTK+ 主题中出 ...
- 打开网页被Java拦截怎么办_win7系统打开网页会弹出“应用程序已被JAVA安全阻止”的解决方法...
很多小伙伴都遇到过win7系统打开网页会弹出"应用程序已被JAVA安全阻止的困惑吧,一些朋友看过网上零散的win7系统打开网页会弹出"应用程序已被JAVA安全阻止的处理方法,并没有 ...
- 怎么查电脑系统版本_程序员的bug解决不了怎么办?
一开始公司新来的新手程序员,最近已经开始了他们的工作,部门的项目经理,为了让他们快速上手,让他们对之前的系统进行BUG修复工作,我认为,这种思路对新手程序员来说,是很有益的,通过查找解决BUG,来熟悉 ...
- java网页安全提示_Win7系统打开网页提示应用程序已被JAVA安全阻止的解决方法
打开电脑浏览网页是我们每天都会接触到的事情,而最近,不少网友表示,打开网页浏览的时候会提示"应用程序已被JAVA安全阻止",这是怎么回事呢?这是由于网页上运行JAVA脚本,但是wi ...
- bug日志:报错 java:程序包javax.persistence.criteria不存在,解决!
bug日志:报错 java:程序包javax.persistence.criteria不存在,解决! 首先上报错图片: 排查问题:按住ctrl用鼠标左键点击框中javax可看到如下图显示 该jar包中 ...
最新文章
- python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用
- 欢迎使用人体运动检测与跟踪CSDN-markdown编辑器
- hihoCoder #1142 : 三分求极值
- 【攻防世界014】tt3441810
- linux查看机器品牌信息,dmidecode查看linux硬件信息
- Java设计模式之结构型:代理模式
- ASCII表完整版(包含16进制对应表)
- HTML 文档的字符编码未声明。如果该文件包含 US-ASCII 范围之外的字符,该文件将在某些浏览浏览器配置中呈现为乱码。页面的字符编码必须在文档或传输协议层声明。
- Android版本演进中的兼容性问题
- ZOJ 3204 Connect them 继续MST
- 从原理到应用,一文带你了解小程序插件能力
- 怎样开发微信小程序(最初的页面)
- 2023 简单在线画板HTML源码
- IntelliJ IDEA设置自动导入包
- Python生态工具
- 【Proteus仿真】Arduino UNO+OLED12864 I2C接口跑图形库
- 阿里云弹性计算总经理张献涛:智能化、高效能、新交互将重塑互联网
- [读书笔记]5个小技巧让你写出更好的JavaScript[图]
- [RK3288][Android6.0] Audio录音frame rate设置流程小结
- 《C++新经典Linux C++通信架构实战》第1章 课程介绍