JVM系列—基本原理
Posted it江湖之旅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM系列—基本原理相关的知识,希望对你有一定的参考价值。
前言
1.什么是JVM
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上模拟各种计算机功能来实现的。这个也是JAVA语言能跨平台的原因。
2.为什么学习JVM
JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,而且也是java面试中必不可少的一个话题
3.JVM的基本原理
3.1 JVM的运行原理
我们都知道java一直宣传的口号是:一次编译,到处运行。那么它如何实现的呢?我们看下图:
java程序经过一次编译之后,将java代码编译为字节码也就是class文件,然后在不同的操作系统上依靠不同的java虚拟机进行解释,最后再转换为不同平台的机器码,最终得到执行。这样我们是不是可以推演,如果要在mac系统上运行,是不是只需要安装mac java虚拟机就行了。那么了解了这个基本原理后,我们尝试去做更深的研究,一个普通的java程序它的执行流程到底是怎样的呢?例如我们写了一段这样的代码:
public class HelloWorld { public static void main(String[] args) { System.out.print("Hello world"); } }
这段程序从编译到运行,最终打印出“Hello world”中间经过了哪些步骤呢?我们直接上图:
3.2 jvm的基本结构
从这个结构不难看出,class文件被jvm装载以后,经过jvm的内存空间调配,最终是由执行引擎完成class文件的执行。当然这个过程还有其他角色模块的协助,这些模块协同配合才能让一个java程序成功的运行,下面就详细介绍这些模板,它们也是后面学习jvm最重要的部分。
1.程序计数器:用来记录每一个线程中下一条要执行的指令,线程之间互不影响相互独立。(线程私有)2.Java虚拟机栈:它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等信息。可能抛出的异常StackOverflowError和OutOfMemoryError(线程私有)3.本地方法栈:发挥的作用于虚拟机栈类似,管理的是本地方法。可能抛出的异常StackOverflowError和OutOfMemoryError(线程私有)4.Java堆:内存中最重要的部分,几乎所有的对象和数组都是在堆内存分配空间的。(线程共享)堆内存可以简单分为新生代(eden区、{S0、S1经过一次GC})和老年代,新生代指的是新建的对象,而老年代指的是经过垃圾回收次数较多的对象。5.方法区(也叫永久区):保存类的元数据(类的类型信息、常量池、域信息、方法信息),GC主要回收常量池和元数据。(线程共享)可以通过参数分配内存的大小,也可以打印内存回收信息。[jdk1.8永久代背取消换成了元数据区,常量池移到了堆内存]
未完待续。。。。
以上是关于JVM系列—基本原理的主要内容,如果未能解决你的问题,请参考以下文章