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种方式:使用内核线程、使用用户线程、使用用户线程加轻量级进程混合实现
锁优化:自旋锁与自适应自选、锁消除、锁粗化、轻量级锁——、偏向锁
- JVM
- jvm
- JVM
- JVM
- JVM
- JVM
- jvm
- jvm
- jvm
- JVM
- JVM
- jvm
- JVM
- JVM
- jvm
- jvm
- jvm
- JVM
- 重拾Python 十七
- 华为研发工程师编程题-- 明明的随机数
- 2016noipPJ总结(弄ip)
- html5网页中用video标签无法播放MP4视频的解决方法
- HDU 2647 Reward (拓扑排序)
- JVM
- blackhole 带你抓妹纸哦
- 实例讲解java局部变量(包括形参)全局变量,对象应用在堆栈中的运行机制
- Linux调度IO模型
- VIS(Vegetation-Impervious surface-Soil)模型
- concurrenthashmap
- opencv最小包络矩形
- python 堆和优先队列的使用
- leetcode_[python/C++]_121/122/123/188.Best Time to Buy and Sell Stock I/II/III/IV