JVM -- 一、Java虚拟机初识与了解

博主我的认为,做为Java开发者,只会敲代码,不知道JVM是不行的。所以博主这几天在学习了下JVM,顺便把所学的知识点记录下,与你们一块儿分享交流。java

    一块儿学习,一块儿进步。继续沉淀,慢慢强大。但愿这文章对您有帮助。如有写的很差的地方,欢迎评论给建议哈!tomcat

    初写博客不久,我是杨展浩。这是个人第十二篇博客。加油!!!服务器

    本篇关于JVM的理论东西比较多,所以文字比较多,看了以后会对JVM有个大致的概念,起码别人在讨论JVM的时候,你不会说一脸懵逼的听。也能够参与讨论学习。网络

    不说闲话,先丢个图先。Java虚拟机的基本机构图。eclipse

   

 

接下来就是根据上述的图中的每一个框框进行一一讲解,起码知道这块是个什么东西,干什么用的先。入个门。jvm

    一、类加载子系统方法区函数

        类加载子系统负责经过文件系统或者网络上加载Class信息(类),性能

        因为Class信息(类)会被频繁使用,JVM不可能不断启动关闭启动关闭去加载Class信息,像Tomcat,WebLogic这些中间容器,只启动一次存。学习

        所以JVM会将从 类加载子系统 加载到的Class信息 存放在一块称为 方法区 的内存空间中,供新建立的线程去公共调用。除此以外, 方法区 还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是 Class 文件中常量池部分的内存映射)。优化

 

    二、Java堆(重点 !!! 重点)

         j ava 堆在虚拟机启动的时候就创建了,它是 java 程序最主要的内存工做区域。 几乎全部的 java 对象实例都存放在 java 堆中
         堆空间是全部线程共享使用的。 
         这是一块与 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寄存器 (学过单片机的朋友应该知道寄存器

        PCProgram 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)

        Java HotSpot Client 模式和 Server 模式的区别:
        当虚拟机运行在-client 模式的时候, 使用的是一个代号为 C1 的轻量级编译器 , 而运行在-server 模式启动的虚拟机采用相对重量级,代号为 C2 的编译器 . C2 C1 编译器编译的相对完全 ,服 务起来以后,性能更高 JDK 安装目录/jre/lib/ x86 i386 amd32 amd64 )/jvm.cfg 文件中的内容,-server 和 -client 哪个配置在上,执行引擎就是哪个。若是是 JDK1.5 及以上版本且是 64 位系统应用时, -client 无效。
        --64 位系统内容                --32 位系统内容
        -server KNOWN                -server KNOWN
        -client IGNORE                  -client KNOWN
注意:在部分 JDK1.6 版本和后续的 JDK 版本 (64 位系统 ) 中, -client 参数已经不起做用了,Server 模式成为惟一。

  

 

相关文章
相关标签/搜索