Listener
监听器笔记1、观察者模式 观察者监控被观察者的行为 被观察者做出相应的动作会触发事件 当观察者发现被观察者触发事件,就会调用事先准备好的方法 2、监听器分类 监听域对象本身 ServletContext HttpSession HttpServletRequest 监听域对象的属性域 应用域 会话域 请求域 监听存入Session域的对象本身 对象是否存入会话域 对象是否和Session一起被钝化到了硬盘上 3、后续用到的监听器名称:ServletContextListener 方法: 方法名 作用 contextInitialized(ServletContextEvent sce) ServletContext创建时调用 contextDestroyed(ServletContextEvent sce) ServletContext销毁时调用 将来在SpringMVC中会用到:ContextLoaderListener,这个监听器就是实现了ServletContextListener接口。
Filter
过滤器笔记1、过滤器三要素 拦截:一个请求必须先把它拦住,才能做后续处理 过滤:预设的检查条件,满足条件才可以放行 放行:对于满足要求的请求,放它过去,让它原本要访问什么资源就继续还是访问那个资源 2、过滤器生命周期 生命周期环节 调用的方法 时机 次数 创建对象 无参构造器 默认:Web应用启动时 一次 初始化 init(FilterConfig filterConfig) 创建对象后 一次 处理请求 doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 接收到请求后 多次 清理操作 destroy() Web应用卸载之前 一次 3、拦截请求时的匹配规则 精确匹配 模糊匹配★ 前杠后星:/user/* 前星后缀:*.html 根据Servlet名称匹配 4、Filter链 概念:拦截同一资源的多个Filter 执行顺序:由web.xml中filter-mapping配置的顺序决定 chain.doFilter(req,res...
JDBC核心技术
[TOC] JDBC核心技术 第1章:JDBC概述1.1 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。 持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。 1.2 Java中的数据存储技术 在Java中,数据库存取技术可分为如下几类: JDBC直接访问数据库 JDO (Java Data Object )技术 第三方O/R工具,如Hibernate, Mybatis 等 JDBC是java访问数据库的基石,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。 1.3 JDBC介绍 JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)...
Java运行期优化
运行期优化 我们知道,Java 是解释执行的,可是解释执行毕竟还是有点慢的,这也使得 Java 一直被认为是效率低下的语言……,不过随着即时编译技术的发展,Java 的运行速度得到了很大的提升,在本篇文章中,我们将会对 Java 的运行期优化,也就是即时编译 (Just In Time, JIT) 时进行的优化进行详细的讲解,我们先来看看什么是即时编译。 运行期优化 即时编译 HotSpot 虚拟机内的即时编译器运作过程 为什么要使用解释器与编译器并存的架构? 为什么虚拟机要实现两个不同的 JIT 编译器? 什么是虚拟机的分层编译? 如何判断热点代码,触发编译? 什么是热点代码? 什么是 “多次” 执行? HotSpot 中每个方法的 2 个计数器 HotSpot 热点代码探测流程 热点代码编译的过程? 经典优化技术介绍 公共子表达式消除【语言无关】 数组范围检查消除【语言相关】 方法内联【最重要】 逃逸分析【最前沿】 基本行为 对于不会逃逸到方法或线程外的对象能进行优化 虚拟机参数 一个优化的例子 即时编译什么是即时编译? 当虚拟机发现某个方法或某段代...
虚拟机调优案例分析
虚拟机调优案例分析 虚拟机调优案例分析 高性能硬件上的程序部署策略 服务系统经常出现卡顿(Full GC 时间太长) 除了 Java 堆和永久代之外,会占用较多内存的区域 从 GC 调优角度解决新生代存活大量对象问题(Minor GC 时间太长) 高性能硬件上的程序部署策略 补充:64 位虚拟机 在 Java EE 方面,企业级应用经常需要使用超过 4GB 的内存,此时,32 位虚拟机将无法满足需求,可是 64 位虚拟机虽然可以设置更大的内存,却存在以下缺点: 内存问题: 由于指针膨胀和各种数据类型对齐补白的原因,运行于 64 位系统上的 Java 应用程序需要消耗更多的内存,通常要比 32 位系统额外增加 10% ~ 30% 的内存消耗。 性能问题: 64 位虚拟机的运行速度在各个测试项中几乎全面落后于 32 位虚拟机,两者大概有 15% 左右的性能差距。 服务系统经常出现卡顿(Full GC 时间太长)首先 jstat -gcutil 观察 GC 的耗时,jstat -gccapacity 检查内存用量(也可以加上 -verbose:gc 参数获取 GC 的详细...
JVM常见参数设置
JVM 常见参数设置 JVM 常见参数设置 内存设置 参数 设置经验 收集器设置 参数 内存设置参数 -Xms:初始堆大小,JVM 启动的时候,给定堆空间大小。 -Xmx:最大堆大小,如果初始堆空间不足的时候,最大可以扩展到多少。 -Xmn:设置年轻代大小。整个堆大小 = 年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为 64M,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8。 -Xss: 设置每个线程的 Java 栈大小。JDK 5 后每个线程 Java 栈大小为 1M。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。 -XX:NewRatio=n:设置年轻代和年老代的比值。如为 3,表示年轻代与年老代比值为 1:3。 -XX:MaxTenuringThreshold:设置垃圾最大年龄。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用(即 ...
常用虚拟机性能监控工具
常用虚拟机性能监控工具 常用虚拟机性能监控工具 JDK 命令行工具 补充:ps 命令 (Linux) JDK 命令行工具 其中的重中之重是 jstat 命令!而它最常用的参数就是 -gcutil,使用格式如下: 1 jstat -gcutil [pid] [intervel] [count] 输出如下: S0:堆上 Survivor space 0 区已使用空间的百分比 S1:堆上 Survivor space 1 区已使用空间的百分比 E:堆上 Eden 区已使用空间的百分比 O:堆上 Old space 区已使用空间的百分比 P:堆上 Perm space 区已使用空间的百分比 YGC:从程序启动到采样时发生的 Minor GC 次数 YGCT:从程序启动到采样时 Minor GC 所用的时间 FGC:从程序启动到采样时发生的 Full GC 次数 FGCT:从程序启动到采样时 Full GC 所用的时间 GCT:从程序启动到采样时 GC 的总时间 补充:ps 命令 (Linux)对于 jps 命令,其实没必要使用,一般使用 Linux 里的 p...
虚拟机字节码执行引擎_02
基于栈的字节码解释执行引擎这个栈,就是栈帧中的操作数栈。 解释执行先通过 javac 将代码编译成字节码,虚拟机再通过加载字节码文件,解释执行字节码文件生成机器码,解释执行的流程如下: 1 词法分析 -> 语法分析 -> 形成抽象语法树 -> 遍历语法树生成线性字节码指令流 指令集分类基于栈的指令集 优点: 可移植:寄存器由硬件直接提供,程序如果直接依赖这些硬件寄存器,会不可避免的受到硬件的约束; 代码更紧凑:字节码中每个字节对应一条指令,多地址指令集中还需要存放参数; 编译器实现更简单:不需要考虑空间分配问题,所需的空间都在栈上操作。 缺点: 执行速度稍慢 完成相同的功能,需要更多的指令,因为出入栈本身就产生相当多的指令; 频繁的栈访问导致频繁的内存访问,对于处理器而言,内存是执行速度的瓶颈。 示例: 两数相加 1 2 3 4 iconst_1 // 把常量1入栈 iconst_1 iadd // 把栈顶两元素出栈相加,结果入栈 istore_0 // 把栈顶值存入第0个Slot中 基于寄存...
虚拟机字节码执行引擎_01
方法调用Java 的方法的执行分为两个部分: 方法调用:确定被调用的方法是哪一个; 基于栈的解释执行:真正的执行方法的字节码。 在本节中我们将对方法调用进行详细的讲解,我们知道,一切方法的调用在 Class 文件中存储的都是常量池中的符号引用,而不是方法实际运行时的入口地址(直接引用),直到类加载的时候,甚至是实际运行的时候才回去会去确定要被运行的方法的直接引用,而确定要被运行的方法的直接引用的过程就叫做方法调用。 方法调用 方法调用字节码指令 解析调用 分派调用 静态分派(方法重载) 变量的静态类型和实际类型 重载方法匹配优先级,例如一个字符 ‘a’ 作为入参 动态分派(方法重写) 动态分派的过程 动态分派的实现 单分派与多分派 动态类型语言支持 java.lang.invoke 包 MethodHandle 的使用 MethodHandle 和 Reflection 的区别 invokedynamic 指令 方法调用字节码指令Java 虚拟机提供了 5 个职责不同的方法调用字节码指令: invokestatic:调用静态方法; invokes...
虚拟机字节码执行引擎_00
虚拟机栈栈帧结构 虚拟机栈栈帧结构 局部变量表 局部变量表的空间分配 Slot 的复用 操作数栈 动态连接 方法返回地址 局部变量表 存放方法参数和方法内部定义的局部变量; Java 程序编译为 class 文件时,就确定了每个方法需要分配的局部变量表的最大容量。 最小单位:Slot; 一个 Slot 中可以存放:boolean,byte,char,short,int,float,reference,returnAddress (少见); 虚拟机可通过局部变量表中的 reference 做到: 查找 Java 堆中的实例对象的起始地址; 查找方法区中的 Class 对象。 局部变量表的空间分配 Slot 的复用定义: 如果当前位置已经超过某个变量的作用域时,例如出了定义这个变量的代码块,这个变量对应的 Slot 就可以给其他变量使用了。但同时也说明,只要其他变量没有使用这部分 Slot 区域,这个变量就还保存在那里,这会对 GC 操作产生影响。 对 GC 操作的影响: 1 2 3 4 5 6 public static void main...