标签:热点代码 java roo 翻译 进入 直接 native 字节码 之间
最近开始肝第三次<深入理解Java虚拟机-JVM高级特性与最佳实践>, 每次都是看了就忘, 所以这次准备写点东西记录下来. 个人感觉这本书写的是真的不错, 不同的阶段看有不同的体验, 每次都有很多收获. 话不多说, 直接进入正题.
什么是JVM
Java Vitual Machine, 是一个运行Java代码的平台(划掉), 准确的说应该是运行.class文件的平台, 可一帮助我们屏蔽到不同机器之间的差异, 做到Write Once, Run Anywhere. 通过Jvm, 我们可以看到Sun公司的野心, Jvm不仅要做到平台无关, 还要做到语言无关, 只要你能把你的代码翻译成.class文件, 都能够运行起来. 如新生的Groovy, JRuby, Jython等, Jvm已经逐渐从"Java虚拟机"转变为多语言虚拟机. 关于Jvm之间的区别这里就不扯了.
HotSpot VM
目前使用最广泛的是Sun公司的HotSpot虚拟机, 提供了准确式内存管理(可以清楚的知道一块内存中存放的到底是值还是引用)和热点代码探测技术(通过执行技术器找出最具有编译价值的代码, 然后通过JIT(Just In Time)编译器编译, 触发OSR(栈上替换)).
JVM内存区域
Jvm会在执行Java程序时将它管理的内存划分为几个区域, 如下图(网上盗的图, 自己画的太丑):
程序计数器: 线程私有, 每条线程都一个独立的程序计数器. 记录了当前线程执行到的字节码文件的位置, 如果线程正在执行Java 方法, 这个计数器记录的是虚拟机字节码指令的地址, 如果执行的是Native方法, 则这个计数器的值为空.
Java虚拟机栈: 描述的是Java方法执行的内存模型, 每一个方法对应一个栈帧, 栈帧中存放的有局部变量, 操作数栈, 方法出口等信息, 线程私有
本地方法栈: 为Java执行本地方法服务, 与虚拟机栈的区别时存储的是执行Native方法时的信息.
Java堆: Java虚拟机管理的最大的一块内存区域, 几乎所有的对象都分配在这里(因为JIT编译器的发展与逃逸分析技术的成熟, 栈上分配, 标量替换 等优化手段导致部分对象会直接栈上分配或不分配, 每次看到这些优化技术, 我都感觉自己的软件工程是白学了).
方法区: 存储虚拟机加载的类信息, 常量, 静态常量, 即时编译器编译后的代码,
运行时常量池: class文件中的常量池存储了编译期生成的各种字面量和符号引用, 这部分内容会在类加载之后进入方法区的运行时常量池中存放. 运行期间也可以将新的常量放入常量池.
直接内存: 并不是虚拟机运行时数据区的一部分, 但这部分内存也被平凡使用, 并且会导致OOM.
标签:热点代码 java roo 翻译 进入 直接 native 字节码 之间
原文地址:https://www.cnblogs.com/huhaha/p/9643892.html