4.3 OOM/SOF(1)OOM for Heap:内存泄露(GC Roots的引用链,对象的生命周期超出预期)或者内存溢出(调节JVM参数 -Xms,-Xmx 等)
(2)OOM for Stack:一般在单线程程序中不会出现;在多线程环境下,无法申请到足够的内存去创建线程
(3)SOF for Stack:程序是否有深度递归 。
(4)OOM for Perm :用到像Spring等框架的时候,常常会动态地生成大量的类导致永久代不够用而导致OutOfMemoryError: PermGen Space异常(调大 -XX:MaxPermSize)
5、JVM 调优JVM 调优的主要目标是使系统具有高吞吐、低停顿的特点,其优化手段应从两方面着手:Java虚拟机和Java应用程序 。前者指根据应用程序的设计通过虚拟机参数控制虚拟机逻辑内存分区的大小以使虚拟机的内存与程序对内存的需求相得益彰;后者指优化程序算法,降低GC负担,提高GC回收成功率 。以下是一些常用的JVM调优工具:
(1)Jconsole 与 Visual VM
JConsole 与 Visual VM 都是JDK自带的 Java 性能分析器,可以从命令行或在 GUI shell 中运行,从而可以轻松使用 JConsole来监控 Java 应用程序性能和跟踪 Java 中的代码,其可以从JAVA_HOME/bin/这个目录下找到 。使用 Jconsole 监测死锁示例如下:

文章插图
(1)Jstack
JDK自带的命令行工具,可以查看某个Java进程内的线程堆栈信息,主要用于线程Dump分析 。

文章插图
(1)JPS
jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况及其id 。

文章插图
6、责任链(CoR)模式
目的:请求的发送者与请求的处理者解耦,便于动态的重新组织链和分配责任 。
角色:抽象处理者、具体处理者、客户端 。
UML:

文章插图
传统责任链(CoR)模式的缺点在于:具体处理角色存在着共同的实现责任链结构的行为行为,即责任链的建立和指派包含在实现角色的类中,并没有抽象出来,这直接导致责任链的指派不够灵活 。因此,改进的CoR模式为:使用AOP理念将责任链结构的实现用切面抽象出来,使得各个对象只关注自身必须实现的功能性需求,准确地分离出责任链模式中不同角色的共同行为,例如,

文章插图
改进后责任链(CoR)模式的应用是比较广泛的,包括 Java Web Filter(链式调用),Struts2 Interceptor(Action代理)和SpringMVC等 。
7、单例模式单例模式核心在于为整个系统提供一个唯一的实例,为整个系统提供一个全局访问点 。单例模式从实现上可以分为饿汉式单例和懒汉式单例两种,前者天生就是线程安全的,后者则需要考虑线程安全性,常见的线程安全的懒汉式单例的实现有内部类式和双重检查式两种 。下面给出单例模式几种常见的形式:
(1) 饿汉式单例

文章插图
(1) 懒汉式单例

文章插图
(1) 线程安全的懒汉式单例 —— 内部类方式

文章插图
内部类方式线程安全懒汉式单例的内在原理在于:虚拟机会保证一个类的类构造器<clinit>()在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的类构造器<clinit>(),其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕 。特别需要注意的是,在这种情形下,其他线程虽然会被阻塞,但如果执行<clinit>()方法的那条线程退出后,其他线程在唤醒之后不会再次进入/执行<clinit>()方法,因为在同一个类加载器下,一个类型只会被初始化一次 。
(4) 线程安全的懒汉式单例——双重检查方式

文章插图
8、类的生命周期及其初始化时机
类的生命周期主要包括加载、链接、初始化、使用和卸载五个阶段,如下图所示:
推荐阅读
- 网络编程之 Https 详细分析,超详细知识点
- 如果C++最强大,为什么它不及Java、Python流行?
- Nginx和Tomcat配合实现Java Web服务热部署
- Google 官方Java 编码规范
- JavaScript 里的奇葩知识
- 对于 JavaScript 中循环之间的技术差异概述
- 推荐5个爆款Java开源博客,是我目前用过最好用的博客系统
- 为什么Java类不支持多继承而接口可以?
- 如何利用Java代码操作索引库?
- Java8——异步编程
