线程去执行嵌套的方法时,方法退出,其实就是栈帧出栈的一个过程 从高层面上来看,这个过程最起码需要:恢复上层方法的操作数栈、局部变量表、PC寄存器值、可能还会有新的返回值压入栈中 PC寄存器的值是一定要进行恢复的,此时方法返回地址就用来重置 pc寄存器了 理解至上!
线程去执行嵌套的方法时,方法退出,其实就是栈帧出栈的一个过程 从高层面上来看,这个过程最起码需要:恢复上层方法的操作数栈、局部变量表、PC寄存器值、可能还会有新的返回值压入栈中 PC寄存器的值是一定要进行恢复的,此时方法返回地址就用来重置 pc寄存器了 理解至上!
Serial 串行回收 Serial收集器是最基本、历史最悠久的垃圾收集器了 Serial收集器作为HotSpot中Client模式下的默认新生代垃圾收集器. Serial收集器采用复制算法、串行回收和 STW 机制的方式执行内存回收. 除了年轻代之外,Serial收集器还提供了用于执行老年代垃圾收集的 Serial Old 收集器. Serial Old收集器同样使用了串行回收和 STW 机制,只不过内存回收算法使用的是标记-压缩算法. Serial Old是运行在Client模式下默认的老年代的垃圾回收器 Se…
ParNew并行回收 新生代 在JDK9 中已经被移除了. 对于新生代,回收次数频繁,使用并行方式高效. 对于老年代,回收次数少,使用串行方式节省资源(CPU并行需要切换线程,串行可以省去线程切换的开销) 由于ParNew收集器时基于并行回收,但也并不是说ParNew收集器回收效率在任何场景下都会比Serial收集器更高效 ParNew 收集器运行在多CPU的环境下,由于可以充分利用多CPU、多核心等物理硬件资源优势,可以更快速地完成垃圾收集,提升程序的吞吐量 但是在单个CPU的环境下,ParNew收集器不比Ser…
垃圾回收器 Garbage Collectors 具体算法的落地实现. 概述 JVM并没有在垃圾收集器中进行过多的规定,可以有不同的厂商、不同的版本的JVM来实现. 由于JDK的版本处于高速 迭代过程中,因此Java发展至今已经衍生了众多的GC版本. 从不同角度分析垃圾收集器,可以将GC分为不同的类型. Java不同版本的新特性. 语法层面:Lambda表达式、switch、自动装箱、自动拆箱、enum... API层面:Stream API、新的日期时间、Optional、String、集合框架 底层优化:JVM…
Parallel Scavenge 回收器 吞吐量优先 Parallel和ParNew底层使用的框架是不同的,各成一派 HotSpot的年轻代中除了拥有ParNew收集器是基于并行回收的以外, Parallel Scavenge收集器同样也采用了复制算法、并行回收和"stop the World"机制。 那么Parallel收集器的出现是否多此一举? 和ParNew收集器不同,Parallel Scavenge收集器的目标则是为了达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优…
再谈引用 我们希望能够描述这样一类对象:当内存足够时,则能保留在内存中;当内存空间进行垃圾回收后还是很紧张,则可以对某些对象进行回收 JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、和虚引用(Phantom Refernece),这四种引用强度依次减弱 java.lang.ref 强引用 StrongReference 最传统的"引用定义",是指在程序代码之中普…
analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for m…
堆是分配对象存储的唯一选择吗? 在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述∶ 随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么"绝对"了。 在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃…
堆空间中的参数设置 -XX∶+PrintFlagsInitial ∶查看所有的参数的默认初始值 -XX∶+PrintFlagsFinal ∶查看所有的参数的最终值(可能会存在修改, 不再是初始值) -Xms∶初始堆空间内存(默认为物理内存的1/64) -Xmx∶最大堆空间内存(默认为物理内存的1/4) -Xmn∶设置新生代的大小(初始值及最大值) -XX∶NewRatio∶配置新生代与老年代在堆结构的占比 -XX:SurvivorRatio=8:设置伊甸园区与幸存者区的比例大小 设置太大,幸存者区小,YGC显得没有…
In addition to the local variables and operand stack, the Java stack frame includes data to support constant pool resolution, normal method return, and exception dispatch. This data is stored in the frame data portion of the Java stack frame. 除了局部变量区和操作数栈外,Jav…
操作数栈 Operand Stack 也叫表达式栈 Expression Stack 栈可以用数组或者链表来实现 操作数栈,在方法的执行过程中,根据字节码指令,往栈中写入数据或读取数据,即入栈push和出栈pop 实际上这个过程是借助于执行引擎来完成的 Java虚拟机中解释引擎是基于栈的执行引擎,其中栈指的便是操作数栈 操作数栈,主要用来存储计算的中间结果,也作为计算过程中变量临时的存储空间 操作数栈,就是JVM执行引擎的一个工作区,当一个方法刚开始执行(被调用)时,一个新的栈帧就会被创建出来,但此时这个方法的…
局部变量表 也称局部变量数组或本地变量表 定义一个数字数组(一维),主要用来存储方法参数和定义在方法体内的局部变量 最基本单位:Slot 变量槽 这些数据类型包括 基本数字类型 对象引用 (reference) returnAddress类型 在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型),64位的类型(long和double)占用两个slot byte、short、char在存储前都会转成int,boolean也被转成int,0表示false,1表示true long和d…
运行时数据区 官网文章概述:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.2 线程私有的数据区生命周期和线程一致 PC寄存器 线程私有 JVM中PC是对物理PC的一种抽象模拟:程序钩子、行号指示器 存储指向下一条指令的地址: 唯一一个在JVM规范中没有规定任何OOM情况的区域 执行引擎去PC中地址 操作局部变量表、操作数栈 字节码翻译成机器码 --->交给CPU java是线程抢占式 问题思考: 使用PC寄存器存…
一 | 二 | 三 | 四 | 五 | 六 | 日 |
---|---|---|---|---|---|---|
« 3月 | ||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
COPYRIGHT © 2020 良夜的博客. ALL RIGHTS RESERVED.
This blog has been running:
本站由
This site is protected by wp-copyrightpro.com