1.1) JDK 与 JRE
-
JRE = JVM + 类库
-
JDK = JRE + 开发工具(javac、jconsole 等)
-
服务器 JRE(Jre 7u21 以上,无自动更新)
1.2)安装JDK
-
视窗
-
Linux64:服务器 JRE 64 位
-
Solaris:首先进入第 32 步,然后是 64 位版本
1.3) JVM 的主要组件
热点虚拟机运行时:
-
命令行选项解析
-
JVM 生命周期
-
异常处理
-
致命异常处理
-
类加载
-
口译员
-
Java本机接口
-
线程管理和同步
垃圾收集器——内存管理器
-
影响java应用程序的性能
-
Hotspot JVM 有 4 个 GC:
-
两个被称为“停止世界时刻”(STW GC)垃圾收集器,另外两个是
STW 和并发 GC 的组合
-
STW GC==> 停止所有 Java 应用程序线程。
大多数并发 GC ==> concurrenlty 在 java 应用程序运行时执行
年轻一代VS老一代。
-
Perm Gen (Java 6&7) 类元数据,类数据结构。 Java 8 中不存在 PermGen,只有元空间。
热点GC:
-
Serial GC,单线程 STW 新生代收集器 + 单线程 STW 老年代收集器
(占地面积小)
-
Throughput GC,多线程 STW young + old gen collectorCMS concurrent garbage collector,STW young and ,mostly concurrent old generation
-
G1 垃圾收集器 (>jdk7u4) 多线程 STW region based young GC + STW 和 mostly 的组合
-
并发老年代 GC:G1 vs CMS ==> G1 compact old gen 不需要 Full GC
即时编译器
-
采用字节码 ==> 底层平台的本机代码。
了解运行时系统
-
Java -XX:+PrintFlagsFinal -version ==> 查看 JVM 的运行时参数
-
VisualVM 上的 Visual GC 插件
-
内存池插件
代码缓存——JIT 编译的代码量
-
对于大型企业应用程序,代码缓存空间可能会耗尽,导致应用程序变慢,因为它禁用了 JIT 编译
要监控的指标
-
操作系统级别
-
虚拟机
-
应用
操作系统级别
-CPU使用率:用户CPU、系统CPU和空闲时间
用户 CPU:程序在 OS 内核之外花费的时间
内核(系统)SPU——花费在执行内核代码上的百分比
空闲 CPU – 未使用的 CPU 百分比
目标是执行更多的用户CPU
-虚拟内存使用
换货注意!!!
-进程行为:上下文切换、CPU调度、线程迁移
两种上下文切换:
-
自愿:由于锁定或等待 IO,应用程序线程自愿脱离 CPU
-
this 的高值 ==> 锁争用的指示
-
-
非自愿:==> 有大量应用程序线程多于可用的 CPU 内核
CPU调度队列—>大量app。线程与 CPU 内核数量少 ==> 系统缓慢
磁盘输入输出
网络输入输出
在 Windows 上监控指标
PerfMon——可视化工具
特权时间——内核时间
https://technet.microsoft.com/en-us/library/bb490960.aspx
typeperf-cpu.txt
前 typeperf -si 5 -cf typeperf-cpu.txt
监控 CPU 调度
监控虚拟内存使用情况
监视可用内存和分页活动
如果分页过于频繁 ==> 交换 http://en.wikipedia.org/wiki/Paging