精华内容
下载资源
问答
  • JVM原理

    2020-07-27 17:54:28
    JVM原理 一.jvm简介 JVM是Java Virual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的。Java虚拟机包括一套字节码指令...

    JVM原理

    一.jvm简介

    JVM是Java Virual
    Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,时Java程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改的运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

    二.JRE/JDK/JVM是什么关系?

    JRE是Java运行环境,即(Java Runtime
    Environment),也就是Java平台。所有的Java程序都要在JRE下才能运行。
    JDK是开发工具包,即(Java Development Kit),它是程序开发者用来编译、调试Java程序,它也是Java程序,也需要JRE才能运行。
    JVM是Java虚拟机,即(Java Virual Machine),它是JRE的一部分,一个虚构出来的计算机,它支持跨平台。

    三.jvm原理

    JVM是Java核心和基础,在Java编译器和os平台之间的虚拟处理器。他可以在上面执行Java的字节码程序。Java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台的机器码,通过特定平台运行。
    在这里插入图片描述

    四.JVM体系结构

    类加载器:加载class文件;
    执行引擎:执行字节码或者执行本地方法
    运行时数据区:包括方法区、堆、Java栈、PC寄存器、本地方法栈
    在这里插入图片描述

    五.JVM运行时数据区

    1.pc寄存器:用于存储每个线程下一步将执行的jvm命令
      2.栈:栈是线程私有的,每个线程创建的同时都会创建的同时都会创建JVM栈,JVM栈中存放当前线程中的局部基本类型的变量;
      3.堆:它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。堆是JVM所有线程共享的。
      4.方法区:存放了所加载的类信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息;通过class对象中的getName等方法来获取信息时,实际这些数据是来源于方法区,方法区是全局共享的。
      5.运行时常量池:存放类中固定的常量信息、方法和Field的引用信息等,其空间是从方法区中分配。
      6.本地方法栈:JVM采用本地方法栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

    六.如何判断对象是否存活

    1.引用计数法:给对象中添加一个引用计数器,当一个地方引用了对象,计数加1;当引用失效,计数器减1;当计数器为0表示该对象已死、可回收;但很难解决循环引用问题;

    2.可达性分析:通过一系列称为“GC Root”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象GC Roots没有任何引用链相连,则证明此对象已死、可回收。Java中可以作为GC Roots的对象包括:虚拟机栈中引用的对象、本地方法栈中native方法引用的对象、方法区静态属性引用的对象、方法区常量引用的对象。

    七.JVM垃圾回收

    1.对新生代的对象的收集称为minor GC;
    2.对老年代的对象的收集称为full GC;
    3.程序中主动调用System.gc()强制执行的GC为full GC;
    4.强引用:默认情况下,对象采用的均为强引用;
    5.软引用:适用于缓存场景(只有在内存不够用的情况下才会被回收)
    6.弱引用:在GC时一定会被GC回收
    7.虚引用:用于判断对象是否被GC

    八.垃圾收集算法

    1.标记—清除算法:有两点不足,一个效率问题,标记和清除过程都效率不高;一个是空间问题,标记清除后会产生大量不连续的内存碎片;
    2.复制算法:解决了内存碎片问题,但是内存利用率低;
    3.标记整理算法:解决了内存碎片问题

    九.分代收集算法

    1.新生代:每次GC时都会有大量对象死去,少量存活,使用复制算法;新生代又分为Eden区、Survivor(Survivor from、Survivor to)大小比例默认为8:1:1;JVM给每个对象定义一个对象年龄计数器,乳沟对象在Eden出生并经过第一个Minor GC后仍然存活,并且能被Survivor容纳,将被移入Survivor并且年龄设定为1.每熬过一次Minor GC,年龄就加1,当它的年龄到了一定程度(默认15岁,可以通过XX:MaxTenuringThreshold来设定),就会移入老年代;如果Survivor相同年龄所有对象大小的总和大于Survivor的一半,年龄大于等于x的所有对象直接进入老年代,无需等到最大年龄要求。
    2.老年代:老年代中的对象存活率高、没有额外空间进行分配,就是用标记—清除或标记—整理算法;大对象可以直接进入老年代,JVM可以配置对象达到阈值后进入老年代的大小(-XX:PretenureSizeThreshold)

    垃圾收集器

    Serial收集器:是最基本、历史最久的收集器,单线程,并且在收集是必须暂停所有的工作线程;
    ParNew收集器:是Serial收集器的多线程版本;
    Parallel Scavenge收集器:新生代收集器,并行的多线程收集器。它的目标是达到一个可控的吞吐量,这样可以高效率的利用CPU时间,尽快完成程序的运算任务,适合在后台运算;
    Serial Old收集器:Serial 收集器的老年代版本,单线程,主要是标记—整理算法来收集垃圾;
    Parallel Old收集器:Parallel Scavenge的老年代版本,多线程,主要是标记—整理算法来收集垃圾;Parallel Old 和 Serial Old 不能同时搭配使用,后者性能较差发挥不出前者的作用;
    **CMS收集器:**收集器是一种以获取最短回收停顿时间为目标的收集器;基于标记清除算法,并发收集、低停顿、运作过程复杂(初始标记、并发标记、重新标记、并发清除)。
    CMS收集器有3个缺点:
    1.对CPU资源非常敏感(占用资源);
    2.无法处理浮动垃圾(在并发清除时,用户线程新产生的垃圾叫浮动垃圾),可能出现“Concurrent Mode Failure”失败;
    3.产生大量内存碎片  
    G1收集器:
    特点:
    分代收集,G1可以不需要其他GC收集器的配合就能独立管理整个堆,采用不同的方式处理新生对象和已经存活一段时间的对象;
    空间整合:采用标记整理算法,局部采用复制算法(Region之间),不会有内存碎片,不会因为大对象找不到足够的连续空间而提前触发GC;
    可预测的停顿:能够让使用者明确指定一个时间片段内,消耗在垃圾收集上的时间不超过时间范围内;

    展开全文
  • jvm原理

    2017-07-02 21:16:58
    这是一个之前整理的一张jvm原理图,今天拿出来过了一遍,现在分享一下。具体参考的文章也不太清楚了。后面多学习。 上图:

    这是一个之前整理的一张jvm原理图,今天拿出来过了一遍,现在分享一下。具体参考的文章也不太清楚了。后面多学习。
    上图:
    这里写图片描述

    展开全文
  • JVM 原理

    2014-08-28 10:09:35
    JVM 原理解释  JVM 全称是 Java Virtual Machine ,Java 虚拟机,这个 JVM 你是看不到的,它存在内存中。我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个 JVM 也是有这成套的...

    JVM 原理解释

      JVM 全称是 Java Virtual Machine ,Java 虚拟机,这个 JVM 你是看不到的,它存在内存中。我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个 JVM 也是有这成套的元素,运算器是当然是交给硬件 CPU 还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM 自己的命令集,JVM 的命令集则是可以到处运行的,因为 JVM 做了翻译,根据不同的CPU ,翻译成不同的机器语言。

      JVM 是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中。

      JVM 的组成部分


      Class Loader 类加载器

      类加载器的作用是加载类文件(.class)到内存,Class Loader 加载的 class 文件是有格式要求的。

      类加载的最终产品是位于运行时数据区的堆区的Class对象。

      Class对象封装了类在方法区内部的数据结构。 

      并且向JAVA程序提供了访问类在方法区内的数据结构。

      JVM加载class文件的原理机制

      1. Java 中的所有类,必须被装载到 JMV 中才能运行,这个装载工作是由 JVM 中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中。

      2. Java中的类大致分为三种:

      a) 系统类

      b) 扩展类

      c) 由程序员自定义的类

      3. 类装载方式,有两种:

      a) 隐式装载,程序在运行过程中当碰到通过 new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。

      b) 显式装载,通过 class.forname() 等方法,显式加载需要的类。  

      4. 类加载的动态性体现

      一个应用程序总是由n多个类组成,Java 程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到 JVM 中,其它类等到 JVM 用到的时候再加载,这样的好处是节省了内存的开销。因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是 Java 动态性的一种体现。

      5.Java 类装载器

      Java 中的类装载器实质上也是类,功能是把类载入 JVM 中,值得注意的是 JVM 的类装载器并不是一个,而是三个,层次结构如下:

          Bootstrap Loader  - 负责加载系统类 
                | 
              - - ExtClassLoader  - 负责加载扩展类 
                              | 
                          - - AppClassLoader  - 负责加载应用类

      为什么要有三个类加载器,一方面是分工,各自负责各自的区块,另一方面为了实现委托模型。

      6. 类加载器之间是如何协调工作的

      前面说了,Java中有三个类加载器,问题就来了,碰到一个类需要加载时,它们之间是如何协调工作的,即 Java 是如何区分一个类该由哪个类加载器来完成呢。

      在这里Java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果 Parent 找不到,那么才由自己依照自己的搜索路径搜索类”,注意喔,这句话具有递归性。

    展开全文
  • Jvm原理

    2019-09-25 14:24:39
    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、...

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

    JVM原理

     
    1. JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。

       

    2. JVM的体系结构:

       

      类装载器(ClassLoader)(用来装载.class文件)

      执行引擎(执行字节码,或者执行本地方法)

      运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)

       

       
    3. JVM运行时数据库示意图

       

    JRE/JDK/JVM是什么关系

      
    1. JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。

       

    2.  JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。
       
    3. JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。
       
       

    转载于:https://www.cnblogs.com/whymoney1000/p/11191830.html

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,790
精华内容 6,716
关键字:

jvm原理