Java基础 — JVM虚拟机

看之前先想一想?

  1. Java代码是在哪里运行的?
  2. 源代码又是如何运行的?
  3.  

一 . 什么是JVM

       JVM(Java Virtual Machine),Java虚拟机,JVM是一种用于计算设备的规范,它是虚构出的一台计算机,是通过实际计算上仿真模拟计算机功能来实现。Java虚拟机包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法的域。Java程序是运行在虚拟机上的,只要有JRE运行环境Java程序就可以执行。与操作系统平台类型无关。

     (我的个人理解,它就是一个进程,作用是运行编译好的二进制文件,然后通过解释器变成对应操作系统能识别的机器语言来运行,这也就是为什么java语音能跨平台)

       JRE(Java Runtime Environment),Java运行环境,也就是Java 平台,所有的Java程序都必须在JRE上运行。Java运行环境包含 JVM 和API。(JRE包含虚拟机)

       JDK (Java Development Kit),Java开发工具包,包括Java开发时所需要的API和JRE。

 

二 . JVM 内存结构

      

      1. 方法区

          线程共享区域,该区域主要存放类信息,常量,静态变量,及实时编译器编译的代码等,垃圾机制主要针对这一区域的常            量池和类的卸载进行管理。

       2. 虚拟机堆

           所有线程共享区域,主要存放创建的java对象实例(new的对象),GC主要是对这一区域进行回收。

       3. Java栈

           每个线程独享区域,每个线程都有自己的栈,当执行方法时会产生一个栈帧,主要存放局部变量,动态链接,操作数,方             法出口等信息,方法被调用时进栈,方法结束时出栈,生命周期和线程一样。

        4. 程序计数器

           记录当前执行字节码的指令,属于线程私有的,每个线程都有一个单独的程序计数器,如果执行一个java方法,程序计数             器记录的时当前执行字节码指令地址,如果时执行native方法时,程序计数器时空的。

        5. 本地方法栈

            用于支持native方法执行,存储每个native方法执行状态。本地方法栈和虚拟机栈的运行机制是一样的,唯一区别是虚拟              机栈执行的是java方法 ,本地方法栈执行的是native方法。

            

            JVM内存区域图解(转载):https://www.processon.com/view/link/5b891cc9e4b0fe81b620b2c0

     三. GC(垃圾回收机制)

        1.GC作用

         随着程序运行时间的增长,内存中的实例对象,变量会越来越多,如果不能对失效的对象,变量进行及时回收,就会导致

         系统效率下降,内存溢出,引发系统的异常。

         其中虚拟机栈,程序计数器,本地方法区都是属于线程私有的,生命周期和线程一样,线程销毁即释放。所以GC机制主要

         针对堆中的对象及方法区中变量进行回收。

        2.如何确认对象是否需要回收

         根搜索算法:从GC root根节点从上向下搜索,如果说一个对象不能达到根节点,说明这个对象没有引用,即失效,将会被

         GC回收。

                                                                       

            3.回收算法

              1.标记-清楚

                   从GC root集合根开始扫描,对现有存活对象进行标记,扫描结束时,将未被标记的对象统一进行回收。

                   缺点:会造成很多内存碎片。

           

              2.标记-压缩(整理)

                在标记-清除的基础上,将存活下来的对象进行整理,统一向左边空闲地方进行移动,然后更新对象引用指针。

               

             3.标记-复制

                 将堆内存平均划分为两块相等的内存空间,发生垃圾回收机制时,将存活的对象放入另一块空间上。

                 缺点:用空间换效率,使原先的使用空间缩小一半

                 

              4.分代算法

                将内存主要分成三部分:

                    新生代:将新生代按8:1:1分配,采用标记-复制算法进行操作。

                                  当发生GC时,将eden存放的对象放入From,清空eden。

                                  当再次发生GC时将eden和from存活对象放入To。

                                  如此进行操作,每次发生GC时对象年龄累计+1。

                                  当年龄超过15时,存入老年代。

                                  -XX:MaxTenuringThreshold可以对进入老年代的年龄设置。

                    老年代:用于存放经过多次新生代回收还存活下的对象。

                                  此空间采用标记整理算法。

                                  当老年代空间不足时会触发回收机制(Major GC/Full GC)。

                                  速度一般比年轻代 GC慢10倍以上。

                     永久带:类的元数据如方法数据、方法信息(字节码,栈和变量大小)、运行时常量池、已确定的符号引用和虚方                                     法表等被保存在永久代中。

                                   32位默认永久代的大小为64M,64位默认为85M。

                                   可以通过参数-XX:MaxPermSize进行设置,一旦类的元数据超过了永久代大小,就会抛出OOM异常。

               

             

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值