深入理解Java虚拟机 JVM高级特性与最佳实践 读后日志
Java技术的一个重要优点是:在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性。
选择哪种分配方式由java堆是否规整决定,而java堆是否规整由所采用的垃圾收集器是否带有压缩功能决定。
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
参数 |
描述 |
UseSerialGC |
虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收 |
UseParNewGC |
打开此开关后,使用ParNew + Serial Old的收集器组合进行内存回收 |
UseConcMarkSweepGC |
打开此开关后,使用ParNew+ CMS + Serial Old的收集器组合进行内存回收。Serial Old收集器将作为CMS收集器出现Concurrent Mode Failure失败后的后备收集器使用 |
UseParallelGC |
虚拟机运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge + Serial Old (PS Mark Sweep)的收集器组合进行内存回收 |
UserParallelOldGC |
打开此开关后,使用Parallel Scavenge + Parallel Old的收集器组合进行内存回收 |
SurvivorRatio |
新生代中Eden区域与Survivor区域的容量比值,默认为8,代表Eden: Survivor = 8:1 |
PretenureSizeThreshold |
直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象将直接在老年代分配 |
MaxTenuringThreshold |
晋升到老年代的对象年龄。每个对象在坚持过一次Minor GC之后,年龄就增加1,当超过这个参数值时就进入老年代 |
UseAdaptiveSizePolicy |
动态调整Java堆中各个区域的大小以及进入老年代的年龄 |
HandlePromotionFailure |
是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的所有对象都存活的极端情况 |
ParallelGCThreads |
设置并行GC时进行内存回收的线程数 |
GCTimeRatio |
GC时间占总时间的比率,默认值是99, 即允许1%的GC时间。仅在使用Parallel Scavenge收集器时生效 |
MaxGCPauseMillis |
设置GC的最大停顿时间。仅在使用Parallel Scavenge收集器时生效 |
CMSInitiatingOccupancyFraction |
设置CMS收集器在老年代时间被使用多少后触发垃圾收集。默认值为68%,仅在使用CMS收集器时生效 |
UseCMSCompactAtFullCollection |
设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在使用CMS收集器时生效 |
CMSFullGCsBeforeCompaction |
设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片整理,仅在使用CMS收集器时生效 |
HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。
在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。
正在上传…重新上传取消
正在上传…重新上传取消
类型 |
名称 |
数量 |
u4 |
magic |
1 |
u2 |
minor_version |
1 |
u2 |
major_version |
1 |
u2 |
constant_pool_count |
1 |
cp_info |
constant_pool |
constant_pool_count - 1 |
u2 |
access_flags |
1 |
u2 |
this_class |
1 |
u2 |
super_class |
1 |
u2 |
interfaces_count |
1 |
u2 |
interfaces |
interfaces_count |
u2 |
fields_count |
1 |
field_info |
fields |
fields_count |
u2 |
methods_count |
1 |
method_info |
methods |
methods_count |
u2 |
attribute_count |
1 |
attribute_info |
attributes |
attributes_count |
正在上传…重新上传取消
正在上传…重新上传取消
标志名称 |
标志值 |
含义 |
ACC_PUBLIC |
0x00 01 |
是否为Public类型 |
ACC_FINAL |
0x00 10 |
是否被声明为final,只有类可以设置 |
ACC_SUPER |
0x00 20 |
是否允许使用invokespecial字节码指令的新语义. |
ACC_INTERFACE |
0x02 00 |
标志这是一个接口 |
ACC_ABSTRACT |
0x04 00 |
是否为abstract类型,对于接口或者抽象类来说,次标志值为真,其他类型为假 |
ACC_SYNTHETIC |
0x10 00 |
标志这个类并非由用户代码产生 |
ACC_ANNOTATION |
0x20 00 |
标志这是一个注解 |
ACC_ENUM |
0x40 00 |
标志这是一个枚举 |
正在上传…重新上传取消
验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
转存失败重新上传取消
转存失败重新上传取消
转存失败重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
转存失败重新上传取消
转存失败重新上传取消
转存失败重新上传取消
方法调用计数器触发即时编译
转存失败重新上传取消
回边计数器触发即时编译
转存失败重新上传取消
类型 |
优化技术 |
编译器策略(compiler tactics) |
延迟编译(delayed compilation) 分层编译(tiered compilation) 栈上替换(on-stack replacement) 延迟优化(delayed reoptimization) 静态单赋值表示(static single assignment representation) |
基于性能监控的优化技术(profile-based techniques) |
乐观空值断言(optimistic nullnuess assertions) 乐观类型断言(optimistic type assertions) 乐观类型增强(optimistic type strengthening) 乐观数组长度增强(optimistic array length strengthening) 裁剪未被选择的分支(untaken branch pruning) 乐观的多态内联(optimistic N-morphic inlining) 分支频率预测(branch frequency prediction) 调用频率预测(call frequency prediction) |
基于证据的优化技术(proof-based techniques) |
精确类型推断(exact type inference) 内存值推断(memory value inference) 内存值跟踪(memory value tracking) 常量折叠(constant folding) 重组(reassociation) 操作符退化(operator strength reduction) 空值检查消除(null check elimination) 类型检测退化(type test strength reduction) 类型检测消除(type test climination) 代数简化(algebraic simplification) 公共子表达式消除(common subexpression elimination) |
数据流敏感重写(flow-sensitive rewrites) |
条件常量传播(conditional constant propagation) 基于流承载的类型缩减转换(flow-carried type narrowing) 无用代码消除(dead code elimination) |
语言相关的优化技术(language-specific techniques) |
类型继承关系分析(class hicrarchy analysis) 去虚拟化(devirtualization) 符号常量传播(symbolic constant propagation) 自动装箱消除(autobox elimination) 逃逸分析(escape analysis) 锁消除(lock elision) 锁膨胀(lock coarsening) 消除反射(de-reflection) |
内存及代码位置变换(memory and placement transformation) |
表达式提升(expression hoisting) 表达式下沉(expression sinking) 冗余存储消除(redundant store elimination) 相邻存储合并(adjacent store fusion) 交汇点分离(merge-point splitting) |
循环变换 (loop transformations) |
循环展开(loop unrolling) 循环剥离(loop peeling) 安全点消除(safepoint elimination) 迭代范围分离(iteration range splitting) 范围检查消除(range check elimination) 循环向量化(loop vectorization) |
全局代码调整(global code shaping) |
内联(inlining) 全局代码外提(global code motion) 基于热度的代码布局(heat-based code layout) Switch调整(switch balancing) |
控制流图变换(control flow graph transformation) |
本地代码编排(local code scheduling) 本地代码封包(local code bundling) 延迟槽填充(delay slot filling) 着色图寄存器分配(graph-coloring register allocation) 线性扫描寄存器分配(linear scan register allocation) 复写聚合(copy coalescing) 常量分裂(constant splitting) 复写移除(copy removal) 地址模式匹配(address mode matching) 指令窥空优化(instruction peepholing) 基于确定有限状态机的代码生成(DFA-based code generator) |
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消
正在上传…重新上传取消