博主我的认为,做为Java开发者,只会敲代码,不知道JVM是不行的。所以博主这几天在学习了下JVM,顺便把所学的知识点记录下,与你们一块儿分享交流。java
一块儿学习,一块儿进步。继续沉淀,慢慢强大。但愿这文章对您有帮助。如有写的很差的地方,欢迎评论给建议哈!tomcat
初写博客不久,我是杨展浩。这是个人第十二篇博客。加油!!!服务器
本篇关于JVM的理论东西比较多,所以文字比较多,看了以后会对JVM有个大致的概念,起码别人在讨论JVM的时候,你不会说一脸懵逼的听。也能够参与讨论学习。网络
不说闲话,先丢个图先。Java虚拟机的基本机构图。eclipse
接下来就是根据上述的图中的每一个框框进行一一讲解,起码知道这块是个什么东西,干什么用的先。入个门。jvm
一、类加载子系统 与 方法区函数
类加载子系统负责经过文件系统或者网络上加载Class信息(类),性能
《因为Class信息(类)会被频繁使用,JVM不可能不断启动关闭启动关闭去加载Class信息,像Tomcat,WebLogic这些中间容器,只启动一次存。》学习
所以JVM会将从 类加载子系统 加载到的Class信息 存放在一块称为 方法区 的内存空间中,供新建立的线程去公共调用。除此以外, 方法区 还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是 Class 文件中常量池部分的内存映射)。优化
二、Java堆(重点 !!! 重点)
三、Java栈
每个 java 虚拟机启动的线程都有一个私有的 java 栈,一个线程的 java 栈在线程建立的时候被建立,java 栈中保存着帧信息,java 栈中保存着局部变量、方法参数,同时和 java 方法的调用、返回密切相关。
四、直接内存
能够理解为:java程序中频繁使用到 NIO库 的时候,java程序会直接向 OS系统(术语来的,也就是操做系统)申请一块内存空间进行 NIO 操做。直接内存不属于堆内存。并且访问直接内存的速度要优于堆内存。
因为直接内存是在 java 堆内存外面的,所以它的大小不会直接受限于 Xmx 指定的最大堆大小,可是系统内存是有限的,java 堆内存和直接内存的总和依然受限于操做系统能给出的最大内存。比如:个人机子内存是16G,java 堆内存和直接内存的总和只能小于15G(操做系统在运行占了一部份内存)。
五、本地方法栈 (目前了解便可)
本地方法栈和 java 栈很是相似,最大的不一样在于 java 栈用于方法的调用,而本地方法栈则用于本地方法的调用,做为对 java 虚拟机的重要扩展,java 虚拟机容许 java 直接调用本地方法(一般使用 C 编写)。Object类中就存在 clone() 本地方法。
六、PC寄存器 (学过单片机的朋友应该知道寄存器)
PC(Program Counter)寄存器也是每个线程私有的空间,java 虚拟机会为每个 java 线程建立 PC 寄存器。在任意时刻,一个 java 线程老是在执行一个方法,这个正在被执行的方法称为当前方法。若是当前方法不是本地方法,PC 寄存器就会指向当前正在被执行的指令。若是当前方法是本地方法,那么 PC 寄存器的值就是 undefined 。
七、垃圾回收系统 (GC) 重点学习 !!! 重点学习
试想下开发写代码时候,须要调用到什么对象,使用关键字 new 便可。若是不主动释放的话。堆内存空间就会爆。可是平常开发也没主动地去释放内存,程序照样好好的跑着。这是由于 java 虚拟机 会在程序运行过程当中或者内存不足的状况下,GC会主动执行,回收堆内存中垃圾对象,进而释放内存。
垃圾回收系统是 java 虚拟机的重要组成部分,垃圾回收器能够对方法区、java 堆、直接内存进行回收。其中,java 堆是垃圾收集器的工做重点。和 C/C++不一样,java 中全部的对 象空间释放都是隐式的,也就是说,java 中没有相似 free() 或者 delete() 这样的函数释放指定的内存区域。对于再也不使用的垃圾对象,垃圾回收系统会在后台默默工做,默默查找、标识并释放垃圾对象,完成包括 java 堆、方法区和直接内存中的全自动化管理。
八、执行引擎
执行引擎是 java 虚拟机的最核心组件之一,它负责执行虚拟机的字节码,现代虚拟机 为了提升执行效率,会使用 即时编译(just in time) 技术将方法编译成机器码后再执行。 Java HotSpot Client VM(-client),为在客户端环境中减小启动时间而优化的执行引擎;本地应用开发使用。(如:eclipse)
Java HotSpot Client VM(-server),为在服务器环境中最大化程序执行速度而设计的执行引擎。应用在服务端程序。(如:tomcat)