精华内容
下载资源
问答
  • 什么是JVM

    千次阅读 2018-05-18 16:44:09
    说明:做java开发的几乎都知道jvm这个名词,但是由于jvm对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及专门做性能优化的什么的),很少有人能很好的去学习及理解什么是jvm,以及弄...

    说明:做java开发的几乎都知道jvm这个名词,但是由于jvm对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及专门做性能优化的什么的),很少有人能很好的去学习及理解什么是jvm,以及弄清楚jvm的工作原理,个人认为这块还是非常有必要去认真了解及学习的,特别是刚入门或入门不久的java开发来说,这是java的基石。

    JVM(Java Virtual Machine,Java虚拟机)

        Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。因此在运行时,Java源程序需要通过编译器编译成为.class文件。众所周知java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的外壳,它会装载jvm.dll(windows下,下皆以windows平台为例,linux下和solaris下其实类似,为:libjvm.so),这个动态连接库才是java虚拟机的实际操作处理所在。

        JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。所以,JAVA虚拟机JVM是属于JRE的,而现在我们安装JDK时也附带安装了JRE(当然也可以单独安装JRE)。

    JVM内存区域划分

    粗略分来,JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。

    类装载器

        每一个Java虚拟机都由一个类加载器子系统(class loader subsystem),负责加载程序中的类型(类和接口),并赋予唯一的名字。每一个Java虚拟机都有一个执行引擎(execution engine)负责执行被加载类中包含的指令。JVM的两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。

    执行引擎:它或者在执行字节码,或者执行本地方法

        主要的执行技术有:解释,即时编译,自适应优化、芯片级直接执行其中解释属于第一代JVM,即时编译JIT属于第二代JVM,自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第二代JVM的经验,采用两者结合的方式 。

        自适应优化:开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。

    运行时数据区:主要包括:方法区,堆,Java栈,PC寄存器,本地方法栈

    jvm结构

    • 方法区和堆由所有线程共享

        堆:存放所有程序在运行时创建的对象

        方法区:当JVM的类装载器加载.class文件,并进行解析,把解析的类型信息放入方法区。

    • Java栈和PC寄存器由线程独享

        JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址

    • 本地方法栈:存储本地方法调用的状态

    JVM运行时数据区

        因为jvm运行时的数据区对我们开发来说还是特别重要要掌握的知识所以单拎开来西说下。

    • 方法区域(Method Area)

        在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。

        方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

    • 堆(Heap)

        它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。

        堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的

        Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配

        TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。

    • JavaStack(java的栈):虚拟机只会直接对Javastack执行两种操作:以帧为单位的压栈或出栈

        每个帧代表一个方法,Java方法有两种返回方式,return和抛出异常,两种方式都会导致该方法对应的帧出栈和释放内存。

        帧的组成:局部变量区(包括方法参数和局部变量,对于instance方法,还要首先保存this类型,其中方法参数按照声明顺序严格放置,局部变量可以任意放置),操作数栈,帧数据区(用来帮助支持常量池的解析,正常方法返回和异常处理)。

    • ProgramCounter(程序计数器)

        每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

        若thread执行Java方法,则PC保存下一条执行指令的地址。若thread执行native方法,则Pc的值为undefined

    • Nativemethodstack(本地方法栈):保存native方法进入区域的地址

        依赖于本地方法的实现,如某个JVM实现的本地方法借口使用C连接模型,则本地方法栈就是C栈,可以说某线程在调用本地方法时,就进入了一个不受JVM限制的领域,也就是JVM可以利用本地方法来动态扩展本身。

    JVM垃圾回收

        Sun的JVMGenerationalCollecting(垃圾回收)原理是这样的:把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的算法。(基于对对象生命周期分析)

        通常我们说的JVM内存回收总是在指堆内存回收,确实只有堆中的内容是动态申请分配的,所以以上对象的年轻代和年老代都是指的JVM的Heap空间,而持久代则是之前提到的MethodArea,不属于Heap。

        GC的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

    (1)对新生代的对象的收集称为minor GC;

    (2)对旧生代的对象的收集称为Full GC;

    (3)程序中主动调用System.gc()强制执行的GC为Full GC。

        不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

    (1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)

    (2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)

    (3)弱引用:在GC时一定会被GC回收

    (4)虚引用:由于虚引用只是用来得知对象是否被GC

    • Young(年轻代)

        年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制年老区(Tenured。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。

    • Tenured(年老代)

        年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。

    • Perm(持久代)

        用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。

    转自:https://blog.csdn.net/stanlee_0/article/details/51171382

    展开全文
  • 什么是 JVM

    万次阅读 多人点赞 2019-07-30 15:21:01
    什么是 JVM ? 解析:不仅仅是基本概念,还有 JVM 的作用。 答:JVM,即 Java Virtual Machine,Java 虚拟机。它通过模拟一个计算机来达到一个计算机所具有的的计算功能。JVM 能够跨计算机体系结构来执行 Java 字节...

    什么是 JVM ?

    解析:不仅仅是基本概念,还有 JVM 的作用。

    答:JVM,即 Java Virtual Machine,Java 虚拟机。它通过模拟一个计算机来达到一个计算机所具有的的计算功能。JVM 能够跨计算机体系结构来执行 Java 字节码,主要是由于 JVM 屏蔽了与各个计算机平台相关的软件或者硬件之间的差异,使得与平台相关的耦合统一由 JVM 提供者来实现。

    展开全文
  • JVM详解——什么是JVMJVM优点

    千次阅读 2019-06-11 01:12:52
    JVM详解——什么是JVMJVM优点 最近在学习Java,经常在书中看到JVM这三个字母,那到底什么是JVM呢? 并且JVM的知识在Java面试中也是非常受面试官青睐的知识点,那对于JVM我们到底要掌握哪些呢? 1、JVM概念 JVM是...

    JVM详解——什么是JVM、JVM优点

    最近在学习Java,经常在书中看到JVM这三个字母,那到底什么是JVM呢?

    并且JVM的知识在Java面试中也是非常受面试官青睐的知识点,那对于JVM我们到底要掌握哪些呢?
    在这里插入图片描述

    1、JVM概念

    JVM是Java Virtual Machine(Java虚拟机)的缩写。

    1.1、什么是Java虚拟机呢?Java虚拟机的好处是什么呢?

    答:虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
    简单来说JVM是用来解析和运行Java程序的

    Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够**“一次编译,到处运行”**的原因。

    1.2、图解JVM

    从Java平台的逻辑结构上来看,我们可以从下图来了解JVM:
    在这里插入图片描述从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别,对于JVM自身的物理结构,请看下图:

    在这里插入图片描述

    2、Java代码编译和执行过程

    我们都知道,Java代码的编译是由Java源码编译器来完成,流程图如下所示:
    在这里插入图片描述
    经过以上步骤生成Java字节码文件(即常说的.class文件),Java字节码文件的执行就是由JVM(java虚拟机)执行引擎来完成,流程图如下所示:
    在这里插入图片描述
    Java代码编译和执行的整个过程包含了以下三个重要的机制:

    • Java源码编译机制
    • 类加载机制
    • 类执行机制

    下面一个个来解释以上三个机制

    2.1 Java源码编译机制

    Java 源码编译由以下三个过程组成:

    • 分析和输入到符号表
    • 注解处理
    • 语义分析和生成class文件

    流程图如下所示:
    在这里插入图片描述

    最后生成的class文件由以下部分组成:

    • 结构信息。包括class文件格式版本号及各部分的数量与大小的信息
    • 元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池
    • 方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息

    2.2、类加载机制

    JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:
    在这里插入图片描述
    1)Bootstrap ClassLoader

    负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

    2)Extension ClassLoader

    负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

    3)App ClassLoader

    负责记载classpath中指定的jar包及目录中class

    4)Custom ClassLoader

    属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

    2.3、类执行机制

    JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图所示:
    在这里插入图片描述

    3、JVM内存管理

    3.1、JVM内存组成结构

    JVM栈由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:
    在这里插入图片描述
    1)
    所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:
    在这里插入图片描述

    • 新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
    • 旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象
    • 持久带(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。

    2)

    每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。

    -xss:设置每个线程的堆栈大小. JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。

    3)本地方法栈

    用于支持native方法的执行,存储了每个native方法调用的状态。

    4)方法区

    存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

    3.2、图解JVM内存

    在这里插入图片描述

    在这里插入图片描述

    后期更新:
    JVM垃圾回收机制
    JVM性能调优
    JVM面试题

    JVM的知识点还有很多很多,一边学习,一边分享~

    在这里插入图片描述

    展开全文
  • 什么是JVM

    万次阅读 多人点赞 2018-04-20 16:05:05
    说明:做java开发的几乎都知道jvm这个名词,但是由于jvm对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及专门做性能优化的什么的),很少有人能很好的去学习及理解什么是jvm,以及弄...

    说明:做java开发的几乎都知道jvm这个名词,但是由于jvm对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及专门做性能优化的什么的),很少有人能很好的去学习及理解什么是jvm,以及弄清楚jvm的工作原理,个人认为这块还是非常有必要去认真了解及学习的,特别是刚入门或入门不久的java开发来说,这是java的基石。

    JVM(Java Virtual Machine,Java虚拟机)


    Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。因此在运行时,Java源程序需要通过编译器编译成为.class文件。众所周知java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的外壳,它会装载jvm.dll(windows下,下皆以windows平台为例,linux下和solaris下其实类似,为:libjvm.so),这个动态连接库才是java虚拟机的实际操作处理所在。

    JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。所以,JAVA虚拟机JVM是属于JRE的,而现在我们安装JDK时也附带安装了JRE(当然也可以单独安装JRE)。

    JVM内存区域划分


    粗略分来,JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。

    类装载器


    每一个Java虚拟机都由一个类加载器子系统(class loader subsystem),负责加载程序中的类型(类和接口),并赋予唯一的名字。每一个Java虚拟机都有一个执行引擎(execution engine)负责执行被加载类中包含的指令。JVM的两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。

    执行引擎:它或者在执行字节码,或者执行本地方法


    主要的执行技术有:解释,即时编译,自适应优化、芯片级直接执行其中解释属于第一代JVM,即时编译JIT属于第二代JVM,自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第二代JVM的经验,采用两者结合的方式 。

    自适应优化:开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。

    运行时数据区:主要包括:方法区,堆,Java栈,PC寄存器,本地方法栈

    • 方法区和堆由所有线程共享

    堆:存放所有程序在运行时创建的对象

    方法区:当JVM的类装载器加载.class文件,并进行解析,把解析的类型信息放入方法区。

    • Java栈和PC寄存器由线程独享


    JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址

    • 本地方法栈:存储本地方法调用的状态


    JVM运行时数据区


    因为jvm运行时的数据区对我们开发来说还是特别重要要掌握的知识所以单拎开来西说下。

    • 方法区域(Method Area)


    在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。

    方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

    • 堆(Heap)


    它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。

    堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的。

    Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配。

    TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。

    • JavaStack(java的栈):虚拟机只会直接对Javastack执行两种操作:以帧为单位的压栈或出栈

       

    每个帧代表一个方法,Java方法有两种返回方式,return和抛出异常,两种方式都会导致该方法对应的帧出栈和释放内存。

    帧的组成:局部变量区(包括方法参数和局部变量,对于instance方法,还要首先保存this类型,其中方法参数按照声明顺序严格放置,局部变量可以任意放置),操作数栈,帧数据区(用来帮助支持常量池的解析,正常方法返回和异常处理)。

    • ProgramCounter(程序计数器)

        

    每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

    若thread执行Java方法,则PC保存下一条执行指令的地址。若thread执行native方法,则Pc的值为undefined

    • Nativemethodstack(本地方法栈):保存native方法进入区域的地址

        

    依赖于本地方法的实现,如某个JVM实现的本地方法借口使用C连接模型,则本地方法栈就是C栈,可以说某线程在调用本地方法时,就进入了一个不受JVM限制的领域,也就是JVM可以利用本地方法来动态扩展本身。

    JVM垃圾回收


    Sun的JVMGenerationalCollecting(垃圾回收)原理是这样的:把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的算法。(基于对对象生命周期分析)

    通常我们说的JVM内存回收总是在指堆内存回收,确实只有堆中的内容是动态申请分配的,所以以上对象的年轻代和年老代都是指的JVM的Heap空间,而持久代则是之前提到的MethodArea,不属于Heap。

    GC的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

    (1)对新生代的对象的收集称为minor GC;

    (2)对旧生代的对象的收集称为Full GC;

    (3)程序中主动调用System.gc()强制执行的GC为Full GC。

    不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

    (1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)

    (2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)

    (3)弱引用:在GC时一定会被GC回收

    (4)虚引用:由于虚引用只是用来得知对象是否被GC

    • Young(年轻代)

        

    年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制年老区(Tenured。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。

    • Tenured(年老代)


    年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。

    • Perm(持久代)


    用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。

    我有一个微信公众号,经常会分享一些Java技术相关的干货;如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。

    展开全文
  • 什么是jvm?

    万次阅读 多人点赞 2016-04-17 01:28:29
    说明:做java开发的几乎都知道jvm这个名词,但是由于jvm对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及专门做性能优化的什么的),很少有人能很好的去学习及理解什么是jvm,以及弄...
  • jvm虚拟机-什么是jvm

    千次阅读 多人点赞 2016-12-30 17:23:39
    以前只是看博客什么的对jvm有一个大概的了解,但是没有深入研究。经过一段时间的研究深入理解java虚拟机后>>,才决定写一些关于jvm的文章,不为别的只为了同为技术的程序员们少走一些弯路,因为这本书第一遍读起来...
  • 教妹学Java(七):究竟什么是JVM

    千次阅读 2020-02-08 08:23:36
    本篇文章通过我和三妹对话的形式来谈一谈“究竟什么是 JVM”。 教妹学 Java,没见过这么有趣的标题吧?“语不惊人死不休”,没错,本篇文章的标题就是这么酷炫,接受不了的同学就别点进来看了,所谓好奇心害死猫;...
  • 什么是JVM什么是JAVA?

    千次阅读 2018-05-28 10:05:44
    一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java语言的跨平台并不是指Java语言本身跨平台,而是Java源程序编译后的字节码文件的跨平台,Java程序执行过程是Java源文件编译成.class字节码文件...
  • Java-什么是JVMJVM有什么作用?

    千次阅读 2019-01-12 15:20:04
    在java的学习中会经常见到JVM这个词,但是都没有对JVM有一个明确的解释,我也是在学习过程中遇到了许多知识提及JVM,所以就去查阅资料,写下一些自己查到的理解。 JVM解释 JVM全称为Java Virtual MAchine-Java虚拟机...
  • 必知必会JVM一-什么是JVM

    万次阅读 多人点赞 2020-05-24 17:47:28
    3.什么是虚拟机? 4.JAVA开发包 1.前言 大家都知道,Java程序设计语言最早的口号就是,Write Once,Run Anywhere,一次编写,到处运行。只实现一次编码。可以再任何平台运行。那就吸引了大批的开发者进行尝试,不...
  • 1.JVM定义 JVM(Java Virtual Machine)意思是Java 虚拟机。它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机功能。JVM有自己完善的硬件架构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。 2....
  • JVM调优系列:(一)什么是JVM

    千次阅读 2017-06-23 18:50:50
    JAVA应用由应用线程和JVM系统线程组成: ◦VMThread ◦ VMPeriodic Task Thread ◦Finalizer(java) ◦Reference Handler(java) ◦CompilerThread ◦ SignalDispatcher ◦ Attach ...
  • 什么是JVM?Java虚拟机介绍

    千次阅读 2019-04-21 15:16:00
    本文翻译自javaworld,英文原文链接https://www.javaworld.com/article/3272244/what-is-the-jvm-introducing-the-java-virtual-machine.html Java虚拟机的使用和定义 Java虚拟机有两个主要功能:允许Java程序在...
  • JVM】JAVA虚拟机总结(一)——什么是JVM

    千次阅读 热门讨论 2018-05-20 17:32:36
    前言:Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM——Java Virtual Machine(Java虚拟机)。执行Java程序的两个步骤:由Java语言编写的程序需要进过编译步骤,但这个编译步骤并不会生成特定平台的机器...
  • Java中什么是JVM及其工作原理?

    千次阅读 2016-08-08 21:11:34
    JVM是Java程序运行的平台,它就像一台虚拟出来的计算机一样,负责执行Java编译好的字节码文件。JVM具有非常严格的实现规范,大多数操作系统都可以安装JVM,为Java语言的跨平台性起到了关键的作用。  JVM(Java...
  • 什么是JVM、Java编译器和Java解释器

    万次阅读 多人点赞 2017-10-25 16:42:08
    JVM:够运行Java字节码(Java bytecode)的虚拟机 Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件),这种字节码就是JVM的“机器语言”。javac.exe...
  • 什么是JVM,JDK和JRE联系与区别

    千次阅读 2017-04-18 12:44:05
    1、JVMJVM是JavaVirtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作...
  • 要知道java虚拟机是什么,从虚拟机定义开始:虚拟机是模拟某种计算机体系结构,用来执行某种特定指令集的软件。 虚拟机分成系统虚拟机(VM ware 、Virtual box)和进程虚拟机(adobe flash player 、JVM等等),...
  • 什么是dvm:Dalvik是Google公司自己设计用于Android平台的Java虚拟机,每一个Dalvik 应用作为一个独立...什么是jvmjvm 是java的虚拟机。 Dalvik virtual machine 和Java virtual machine (dvm和jvm)的区别
  • JVM什么

    千次阅读 2019-03-03 14:24:25
    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的...
  • Jvm系列-Jvm概述(一)

    万次阅读 2020-11-07 20:15:55
    1,什么是JVM? 2,JVM跨平台及原理 3,JVM的分类 4,JVM的位置 5,JVM的体系结构 6,Java代码的执行流程 7,JVM的架构模型 8,JVM的生命周期 9,三大商业虚拟机 1,什么是JVMJVM 是 java虚拟机,是...
  • 什么是JDK,JRE,JVM ---深入分析

    千次阅读 多人点赞 2019-05-18 12:21:55
    文章目录What is Java JDK,JRE and JVM ---In-depth Analysis... 什么是JVM2.1 JVM结构2.1.1 Class Loader2.1.2 JVM Memory Areas2.2 JVM Execution Engine(执行引擎)2.2.1 Interpreter(解释器)2.2.2 JIT Compiler(...
  • JVM

    千次阅读 2018-08-06 19:47:22
    JVM JDK1.8 JVM内存模型 JVM(1):Java 类的加载机制 JVM(2):JVM内存结构 JVM(3):Java GC算法 垃圾收集器 JVM(4):Jvm调优-命令篇 JVM(5):tomcat性能调优和性能监控(visualvm) JVM(6):JVM调优-...
  • 【死磕JVMJVM快速入门之前戏篇

    千次阅读 多人点赞 2021-02-24 09:43:05
    什么是JVM JVM是可以运行在Java代码的虚拟的计算机,既然是虚拟的计算机,当然也包含自己的CPU、字节码指令集、寄存器、栈、垃圾回收、堆和存储方法域,我们可以理解成JVM自己就是一套操作系统。 Java从编译到执行 ...
  • JVM预热

    千次阅读 2019-05-06 18:29:02
    什么是JVM预热 JVM预热 : JVM Warm Up 一旦类加载完成,所有重要的类(在进程启动时使用)都会被推送到JVM缓存(本机代码)中,这使得它们在运行时可以更快地访问。其他类是根据每个请求加载的。 对Java Web应用...
  • JVM ZeroTLAB 是什么意思呢?

    千次阅读 2021-02-12 20:32:40
    ZeroTLAB 是 JVM 的一个布尔型 Flag,意思是是否将新创建的 TLAB 内的所有字节归零。 默认:false 举例:-XX:+ZeroTLAB 当分配出来 TLAB 之后,根据 ZeroTLAB 配置,决定是否将每个字节赋 0。在 TLAB 申请时,由于...
  • 什么是JVMJVM(Java Virtual Machine):Java虚拟机 虚拟机(Virtual Machine): 虚拟机是一款软件,用来执行一系列虚拟的计算机指令。 虚拟机分为系统虚拟机和程序虚拟机。 系统虚拟机是对物理计算机的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 901,375
精华内容 360,550
关键字:

什么是jvm