JVM

来源:互联网 发布:php 下载pdf文件 编辑:程序博客网 时间:2024/05/20 05:45

内存管理子系统

运行时数据区域

程序计数器
java虚拟机栈——每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方 法出口等信息。
本地方法栈
java堆——在虚拟机启动时创建,用于存放对象实例,但随着JIT编译器的发展和逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生。另一方面,从内存分配的角度,线程共享的java堆中可能划分出多个线程私有的分配缓冲区。
方法区——线程共享的内存区域。
运行时常量池
直接内存

垃圾收集器

Serial收集器——新生代,复制算法,目标是最短回收停顿时间
ParNew收集器——Seria的多线程版本
Parallel Scanvenge收集器——目标在吞吐量
Serial Old收集器——老年代,标记整理算法
Parallel Old收集器——Parallel Scanvenge收集器的老年代版本
CMS收集器——初始标记->并发标记->重新标记->并发清除

虚拟机性能监控与故障处理工具

jdk的命令行工具

jps——虚拟机进程状况
jstat——统计信息监控
jinfo——查看java配置信息
jmap——java内存映射:获取dump文件,查询finalize执行队列、java堆和永久代的详细信息。
jhat——虚拟机堆转储快照分析工具
jstack——java堆栈跟踪工具

调优案例

高性能硬件上程序部署策略
使用若干个32位虚拟机建立逻辑集群来利用硬件资源
堆外内存导致的溢出错误
虚拟机虽然会对Direct Memory进行回收,但是并不是在发现空间不足了就通知收集器进行垃圾回收,它只能等到老年代满了后Full GC,然后顺带地帮它清理掉内存的废弃对象。否则它只能一直等到抛出内存溢出异常时,先catch掉,再在catch块里调用System.gc()。如果虚拟机设置了-XX:+DisableExplicitGC,那就真的无法收回了。
不恰当数据结构导致内存结构占用过大

Eclipse运行速度调优

编译时间和类加载时间的优化
调整内存设置控制垃圾收集频率
选择收集器降低延迟

字节码执行子系统

分派调用的“稳定优化”手段——在方法区建立一个虚方法表,方法表一般在类加载的连接阶段进行初始化,准备了类的变量初始值后,虚拟机会把该类的方法表也初始完毕。

基于栈的指令集与基于寄存器的指令集:基于栈的指令集的主要优点是可移植、代码相对更加紧凑、编译器实现更加简单等。

JDK的编译子系统

javac将java程序从源码编译成字节码
即时编译器将字节码编译成本地机器码

高效并发

实现线程的主要3种方式:使用内核线程、使用用户线程、使用用户线程加轻量级进程混合实现
锁优化:自旋锁与自适应自选、锁消除、锁粗化、轻量级锁——、偏向锁

0 0