简单易懂的jvm虚拟机学习手册

Posted ListenToCoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单易懂的jvm虚拟机学习手册相关的知识,希望对你有一定的参考价值。

当我们编写完一个Test.java文件后,会被javac编译成.class字节码文件会在jre进行运行,jre由jvm实现,jvm分析字节码进行执行,具体运行过程如下图,因此作为一名合格的程序员,必须掌握jvm的相关知识.

了解jvm虚拟机首先要了解一下虚拟机的概念.


虚拟机:

以软件的方式模拟一个具有完整系统功能,运行在一个隔离环境中的计算机系统,常见的有vmware,virtual box等等.常见的jvm虚拟机有Sun  HotSpot VM,

BEA JRockit VM等等.


由上图可以发现,jvm中最主要的部分就是运行时数据区,接下来就简单介绍一下其中的各个组成部分及其作用.


本地方法栈:

存储本地native方法,在执行引擎执行时加载本地方法库


程序计数器:


java栈:

java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)java栈中,如果线程请求的栈深度大于虚拟机允许的深度,将产生StackOverFlow异常,如果虚拟机栈可以动态扩展当无法申请到足够的内存空间时将产生OutOfMemory异常


简单易懂的jvm虚拟机学习手册


以上三个部分都是线程私有的,声明周期和线程的生命周期相等,因此当线程退出时,这几部分的内存空间将自动释放,所以不属于垃圾回收器关注的范围.


堆:

虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。堆分为新生代和老年代,一个类在新生代生成,应用并被垃圾回收器回收,经过多次GC后仍然存活的对象会被移到老年代.如果老年代也满了,就会进行FullGC,此时其他进程是完全停止的,因此jvm调优主要就是减少FullGC的次数和时间.在java堆中,新生代和老年代占整个堆的比例为1:2  新生代分为伊甸区(eden space)和幸存去(survivor space).当伊甸区的空间被用完时,就会进行轻GC,将不再被引用的对象进行销毁.然后将剩余对象移到幸存0区,再进行轻GC时,伊甸区和幸存0区的对象会移到幸存1区,当一个对象被如此复制16次后还没有被销毁才会正式移到老年代.幸存区分为两部分的原因是因为如果只有一块区域的话,经过轻GC后,幸存区中的对象会不连续存在,而有两块区域的话,通过这种复制算法保证了幸存区1中来幸存区0和伊甸区两部分的存活对象占用连续的内存空间,避免了碎片化的发生.当老年代经过FullGC后没有空间保存从幸存区过来的对象就会产生OOM.

方法区:

类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中.运行时常量池是class常量池(用于存放编译器生成的各种字面量和符号引用)加载到内存后的版本


堆,栈和方法区的交互如下图:


以上两部分,堆和方法区都是线程所共享的.最后讲一下java其实是编译和解释混合运行的,首先java文件经过javac编译成字节码文件,字节码文件经过jvm解析器解释执行.同时,存在jit编译器将'热点代码'进行编译装载提高整体的性能


以上是关于简单易懂的jvm虚拟机学习手册的主要内容,如果未能解决你的问题,请参考以下文章

资源分享 | 深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)

java虚拟机学习-触摸java常量池(13)

JVM学习资料

JVM学习系列 虚拟机监控相关

VMware虚拟机的官网下载和安装激活(简单易懂)

[Java][JVM] Java虚拟机学习之路