精华内容
下载资源
问答
  • 在学习 Java 之前 一定要搞懂 Java虚拟机是如何 运行我们的Java文件 以及 Java代码的. 这样在学习的过程中才会更深刻的理解 编程思维.和电脑运行之间 的关系 Java虚拟机也是面向对象的运行方式 面向对象编程思维 : ...

    在学习 Java 之前 一定要搞懂 Java虚拟机是如何 运行我们的Java文件 以及 Java代码的. 这样在学习的过程中才会更深刻的理解 编程思维.和电脑运行之间 的关系 Java虚拟机也是面向对象的运行方式 面向对象编程思维 : 用编程解决的实际问题 在解决问题时需要用到工具 如何使用自己创造的工具去一一解决大问题中的小问题. 然后梳理解决问题的逻辑. 能解决出结果 不能出结果报异常.

    Java的标准环境
    这里写图片描述

    JVM发展史

    .class 是如何加载的?

    这里写图片描述

    .class在jvm中的运行过程
    这里写图片描述

    展开全文
  • JVM虚拟机工作原理

    2018-04-26 12:01:00
    JVM虚拟机工作原理 从宏观上理解JVM虚拟机的工作原理。首先我们编写的.java原始文件经过编译器生成.class字节码文件。然后通过jre中的类加载器将.class字节码文件加载到jvm内存中并且运行。接着由即时编译器根据...

    JVM虚拟机工作原理

       从宏观上理解JVM虚拟机的工作原理。首先我们编写的.java原始文件经过编译器生成.class字节码文件。然后通过jre中的类加载器将.class字节码文件加载到jvm内存中并且运行。接着由即时编译器根据不同的平台解释器生成机器码。最后由平台执行机器码。

    转载于:https://www.cnblogs.com/huanlingjisi/p/8951142.html

    展开全文
  • 1. JVM内存结构1.1 运行时数据区程序计数器PC Register:JVM支持多线程同时执行,每一个线程都有自己的PC Register,线程正在执行的方法叫做当前方法,如果是java代码,PC Register里面存放的就是房钱正在执行的指令...

    1. JVM内存结构

    1.1 运行时数据区

    82b9b9063b8cd82a417c31c98e4a5485.png
    • 程序计数器PC Register:JVM支持多线程同时执行,每一个线程都有自己的PC Register,线程正在执行的方法叫做当前方法,如果是java代码,PC Register里面存放的就是房钱正在执行的指令的地址,如果你是C代码,则为空。
    • Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口灯信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
    • Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
    • 方法区(Method Area):方法区域java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常亮、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的是与Java堆区分开来。
    • 运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的常量池中存放。
    • 本地方法栈(Native Method Stacks)与虚拟机栈所放回的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行的Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

    1.2 JVM的内存结构

    7035a66569560fbeb40cac2b954e90c8.png

    实例:
    启用压缩类空间:

    0bf72c17019963b2e82775a25bbe8135.png


    jstat -gc 13144

    5de8e4104021dd5cd9d3bcc69c15d3ee.png


    禁用压缩类空间:

    8949a8a643274a023fe2d7b72ce80088.png


    jstat -gc 13523

    9054524bcffebb459f446b9fe934b760.png


    codecache也是一样操作。
    -xint

    6436aaab1f4d12625a8189ce98724e6c.png

    常用参数:

    • -Xms-Xmx
    • -XX:NewSize -XX:MaxNewSize
    • -XX:NewRatio -XX:SurvivorRatio
    • -XX:MetaspaceSize -XX:MaxMetaspaceSize
    • -XX:+UseCompressedClassPointers
    • -XX:CompressedClassSpaceSize
    • -XX:InitialCodeCacheSize
    • -XX:ReservedCodeCacheSize

    2. 垃圾回收算法

    2.1 如何确定垃圾

    2.2 各类算法

    对象分配:

    • 对象优先分配在Eden区。
    • 大对象直接进入老年代:-XX:PretenureSizeThreshold,该参数规定多大的对象会直接分配在老年代。
    • 长期存活对象进入老年代:
      -XX:MaxTenuringThreshold 晋升阈值
      -XX:+PrintTenuringDistribution 发生Young GC时候,打印存活对象的年龄的分布情况
      -XX:TargetSurivorRatio 设置Surivor区,Young区垃圾回收后存活对象的比例,假设该值设置为80%,意味着发生一次Young GC,Surivor区存活对象为80%,这时候需要计算这些80%存活对象的平均年龄,用平均年龄和晋升阈值之间取一个最小值,如果有对象年龄大于该最小值,也会将该对象晋升到老年代。

    3. 垃圾收集器

    3.1 三种类型垃圾收集器

    • 串行收集器Serial:Serial、Serial Old。单线程,适用于内存小的嵌入式设备。
    • 并行收集器Parallel:Paralel Scavenge、Parallel Old,吞吐量优先。
    • 并发收集器Concurrent:CMS、G1,停顿时间优先。

    3.2 并行VS并发

    • 并行是指多条垃圾收紧线程并行工作,但此时用户线程仍然处于等待状态。适合科学计算、后台处理等弱交互场景。
    • 并发指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),垃圾收集线程在执行的时候不会停顿用户程序的运行。适合对响应时间有要求的场景,比如Web。

    3.3 停顿时间VS吞吐量

    • 停顿时间:垃圾收集器做垃圾回收中断应用执行的时间,-XX:MaxGCPauseMillis
    • 吞吐量:花在垃圾收集的时间和花在应用时间的占比。-XXGCTimeRatio=,来及收集时间占:1/1+n。

    3.4 如何评价一个垃圾回收器的好坏

    3.5 三种类型垃圾收集器开启与停用

    串行收集器:

    并行收集器:

    并发收集器:

    a6b4950d01b6f19625bf8b0e6e885b7b.png

    3.6 垃圾收集器搭配

    ccb13492c364f83bdf9581e1ef02f32c.png
    • 有连线的是可以相互搭配使用。
    • JDK8推荐使用G1,性能比较好,在Yong区和Old区都可以使用。
    • 虚线表示CMS可能退化成SerialOld,空间担保分配失败。

    如何选择垃圾收集器

    • 优先调整堆的大小,让JVM自己来选择;
    • 如果内存小于100M,使用串行收集器;
    • 如果是单核,并没有停顿时间的要求,串行或JVM自己选;
    • 如果允许停顿时间超过1秒,选择并行或JVM自己选;
    • 如果响应时间非常重要,并且不能超过1秒,使用并发收集器;

    3.7 两种常用垃圾收集器

    3.7.1 Parallel Collector

    工作原理:当发现内存不够时,暂停应用程序,启动多个垃圾回收线程来回收垃圾,垃圾回收结束后,重新启动应用程序。
    -XX:+UseParallelGC 手动开启,server模式默认开启;
    -XX:ParallelGCThreads= 开启多少个GC线程;

    并行收集器的自适应特性(Parallel Collector Ergonomics),会自动调整堆得大小,来自适应调整满足我们设定的指标:

    • -XX:MaxGCPauseMills= 最大停顿时间;
    • -XX:GCTimeRatio= 吞吐量;
    • -Xmx 堆的大小;
      优先满足停顿时间要求,然后满足吞吐量要求,如果两个都满足的话,它会减小堆得大小,来满足停顿时间的要求,直到这三个条件中有一个是满足不了的。自适应其实不是最优的,因为它需要动态调整堆得大小来满足这些条件。
      动态内存调整
      并行收集器在自适应的时候会动态调整内存;
    • -XX:YongGenerationSizeIncrement= Yong区动态调整每次增加的大小,默认20%;
    • -XX:TenuredGenerationSizeIncrement= Old区动态调整每次增加的大小,默认20%;
    • -XX:AdaptiveSizeDecrementScaleFactor= 动态减小时每次减小的大小,默认4%;
      在生产环境下很少使用自适应功能,主要通过手动调整。

    3.7.2 CMS Collector

    (1)CMS垃圾收集过程

    展开全文
  • 9: return } 三:Java虚拟机的构成 1、JVM 虚拟机有三块构成:类加载子系统、运行时数据区、执行引擎 2、classloader 把 App.class 文件加载到内存中(JVM运行时数据区) 3、执行引擎(可以理解为CPU)分配一个线程...

    一:Java完整体系结构图

    在这里插入图片描述

    二:执行流程

    1、App.java
    package com.lemon.employee.common.test;
    
    public class App {
        //类的属性:常量、变量、成员属性
        private Object object = new Object();
        private static int i = 0;
        private static String s = "Demo";
        private String name;
    
        public int add() {
            int a = 1;
            int b = 2;
            int c = (a + b) * 100;
            return c;
        }
    
        /**
         * 程序入口
         *
         * @param args
         */
        public static void main(String[] args) {
            App demo = new App();
            int result = demo.add();
            System.out.println(result);
        }
    }
    
    2、App.class(十六进制文件)
    cafe babe 0000 0034 003b 0a00 0200 2907
    002a 0900 0400 2b07 002c 0a00 0400 290a
    0004 002d 0900 2e00 2f0a 0030 0031 0900
    0400 3208 0033 0900 0400 3401 0006 6f62
    6a65 6374 0100 124c 6a61 7661 2f6c 616e
    672f 4f62 6a65 6374 3b01 0001 6901 0001
    4901 0001 7301 0012 4c6a 6176 612f 6c61
    6e67 2f53 7472 696e 673b 0100 046e 616d
    6501 0006 3c69 6e69 743e 0100 0328 2956
    0100 0443 6f64 6501 000f 4c69 6e65 4e75
    6d62 6572 5461 626c 6501 0012 4c6f 6361
    6c56 6172 6961 626c 6554 6162 6c65 0100
    0474 6869 7301 0024 4c63 6f6d 2f6c 656d
    6f6e 2f65 6d70 6c6f 7965 652f 636f 6d6d
    6f6e 2f74 6573 742f 4170 703b 0100 0361
    6464 0100 0328 2949 0100 0161 0100 0162
    0100 0163 0100 046d 6169 6e01 0016 285b
    4c6a 6176 612f 6c61 6e67 2f53 7472 696e
    673b 2956 0100 0461 7267 7301 0013 5b4c
    6a61 7661 2f6c 616e 672f 5374 7269 6e67
    3b01 0004 6465 6d6f 0100 0672 6573 756c
    7401 0010 4d65 7468 6f64 5061 7261 6d65
    7465 7273 0100 083c 636c 696e 6974 3e01
    000a 536f 7572 6365 4669 6c65 0100 0841
    7070 2e6a 6176 610c 0013 0014 0100 106a
    6176 612f 6c61 6e67 2f4f 626a 6563 740c
    000c 000d 0100 2263 6f6d 2f6c 656d 6f6e
    2f65 6d70 6c6f 7965 652f 636f 6d6d 6f6e
    2f74 6573 742f 4170 700c 001a 001b 0700
    350c 0036 0037 0700 380c 0039 003a 0c00
    0e00 0f01 0004 4465 6d6f 0c00 1000 1101
    0010 6a61 7661 2f6c 616e 672f 5379 7374
    656d 0100 036f 7574 0100 154c 6a61 7661
    2f69 6f2f 5072 696e 7453 7472 6561 6d3b
    0100 136a 6176 612f 696f 2f50 7269 6e74
    5374 7265 616d 0100 0770 7269 6e74 6c6e
    0100 0428 4929 5600 2100 0400 0200 0000
    0400 0200 0c00 0d00 0000 0a00 0e00 0f00
    0000 0a00 1000 1100 0000 0200 1200 1100
    0000 0400 0100 1300 1400 0100 1500 0000
    3e00 0300 0100 0000 102a b700 012a bb00
    0259 b700 01b5 0003 b100 0000 0200 1600
    0000 0a00 0200 0000 0300 0400 0500 1700
    0000 0c00 0100 0000 1000 1800 1900 0000
    0100 1a00 1b00 0100 1500 0000 6100 0200
    0400 0000 0d04 3c05 3d1b 1c60 1064 683e
    1dac 0000 0002 0016 0000 0012 0004 0000
    000b 0002 000c 0004 000d 000b 000e 0017
    0000 002a 0004 0000 000d 0018 0019 0000
    0002 000b 001c 000f 0001 0004 0009 001d
    000f 0002 000b 0002 001e 000f 0003 0009
    001f 0020 0002 0015 0000 005f 0002 0003
    0000 0015 bb00 0459 b700 054c 2bb6 0006
    3db2 0007 1cb6 0008 b100 0000 0200 1600
    0000 1200 0400 0000 1700 0800 1800 0d00
    1900 1400 1a00 1700 0000 2000 0300 0000
    1500 2100 2200 0000 0800 0d00 2300 1900
    0100 0d00 0800 2400 0f00 0200 2500 0000
    0501 0021 0000 0008 0026 0014 0001 0015
    0000 0026 0001 0000 0000 000a 03b3 0009
    120a b300 0bb1 0000 0001 0016 0000 000a
    0002 0000 0006 0004 0007 0001 0027 0000
    0002 0028 
    
    3、App.txt(对 App.class 文件执行反汇编,也就是JVM可以识别的文件)

    进入 App.class 文件夹,执行 javap -c App.class 生成对应的指令,然后输入 App.txt
    在这里插入图片描述

    Compiled from "App.java"
    public class com.lemon.employee.common.test.App {
      public com.lemon.employee.common.test.App();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: aload_0
           5: new           #2                  // class java/lang/Object
           8: dup
           9: invokespecial #1                  // Method java/lang/Object."<init>":()V
          12: putfield      #3                  // Field object:Ljava/lang/Object;
          15: return
    
      public int add();
        Code:
           0: iconst_1
           1: istore_1
           2: iconst_2
           3: istore_2
           4: iload_1
           5: iload_2
           6: iadd
           7: bipush        100
           9: imul
          10: istore_3
          11: iload_3
          12: ireturn
    
      public static void main(java.lang.String[]);
        Code:
           0: new           #4                  // class com/lemon/employee/common/test/App
           3: dup
           4: invokespecial #5                  // Method "<init>":()V
           7: astore_1
           8: aload_1
           9: invokevirtual #6                  // Method add:()I
          12: istore_2
          13: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
          16: iload_2
          17: invokevirtual #8                  // Method java/io/PrintStream.println:(I)V
          20: return
    
      static {};
        Code:
           0: iconst_0
           1: putstatic     #9                  // Field i:I
           4: ldc           #10                 // String Demo
           6: putstatic     #11                 // Field s:Ljava/lang/String;
           9: return
    }
    

    在这里插入图片描述

    三:Java虚拟机的构成

    在这里插入图片描述
    1、JVM 虚拟机有三块构成:类加载子系统、运行时数据区、执行引擎
    2、classloader 把 App.class 文件加载到内存中(JVM运行时数据区)
    3、执行引擎(可以理解为CPU)分配一个线程去执行 App.class 文件

    四:执行过程

    在这里插入图片描述

    1、程序计数器

    指向当前线程所执行的字节码指令的地址(行号)
    在这里插入图片描述

    2、栈

    在这里插入图片描述
    在这里插入图片描述

    3、本地方法栈

    存放被 native 修饰的方法。比如:public static native void sleep(long millis) throws InterruptedException;

    4、堆

    1、存放对象的地方。比如:案例中的 App 对象
    2、把堆内存的地址存放在栈里面

    5、方法区(元空间)

    1、存放类的模板信息。比如案例中的

    	private Object object = new Object();
        private static int i = 0;
        private static String s = "Demo";
        private String name;
    
    展开全文
  • JVM虚拟机执行原理

    2020-05-25 23:53:49
    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台...
  • 原价99元的《JVM虚拟机底层原理分析与性能优化》课程,现在活动限时优惠...本课程重点对JVM虚拟机底层原理进行全面讲解,从JVM内存结构、堆的分代与垃圾回收算法、JVM性能调优,帮助大家全面理解JVM的运行机制。 ...
  • jvm虚拟机工作原理

    千次阅读 2018-05-31 15:23:23
    1.什么是虚拟机 联想到的问题,为什么说java一次变异到处运行? 虚拟机是什么?java的虚拟机又是什么? 带着几个问题 看我怎么解释 何为一次变异导出运行,只要有java环境的电脑 不管你是什么...
  • JVM虚拟机原理

    2019-04-20 23:10:22
    1. jvm介绍 jvm是一种用于计算设备的规范,...java编译器只面向jvm虚拟机,生成jvm能理解的代码或字节码文件。java源文件经编译成字节码程序,通过虚拟机将指令编译成不同的机器码,通过特定平台运行 java是编译行语...
  • 一、请简单描述一下JVM加载class文件的原理是什么? JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。类加载器加载到到JVM...
  • JVM虚拟机 JVM运行流程 生成.class可执行 >>> 类装载子系统 >>> 运行时数据区(内存模型) >>> 字节码执行引擎 内存模型 栈 局部变量表 ​ 存放局部变量 操作数栈 ​ 存放临时的操作...
  • JVM虚拟机原理 JVM 组成架构 Java 是一种跨平台的语言,JVM 屏蔽了底层系统的不同,为Java 字节码文件构造了一个统一的运行环境。 Windows, Mac OS, Android OS每个不同的环境下,执行引擎会不一样, 实现跨平台。 ...
  • JVM虚拟机底层实现 .java文件—>通过javac指令进行编译—>.class文件—>放到jvm上运行
  • java在JVM上的运行过程: 1,编辑好的java代码(IDE无报错,测试运行无错误); 2,java源代码通过javac编译成class文件(字节码文件,全是二进制数据,是供神看的东西); 3,class文件加载到JVM上,继续二次...
  • Java能够被称为“一次编译,到处运行”的原因就是Java屏蔽了很多的操作系统平台相关信息,使得Java只需要生成在JVM虚拟机运行的目标代码也就是所说的字节码,就可以在多种平台运行。 JDK JRE java运行时环境的...
  • jvm虚拟机原理

    2019-05-09 21:44:16
    虚拟机栈:一个方法为一个栈帧,(递归是多个方法) 栈指向堆 堆:存放对象实例 方法区:静态变量+常量 本地方法栈:native底层掉c++,本地私有的方法 栈与堆的原理 栈是运行时的单位,而堆是存储的单位。 ...
  • JVM虚拟机原理与调优详解 JVM java虚拟机 JVM从软件的层面屏蔽了底层硬件指令层面的细节 JVM是什么 java源码文件——>.class文件 问题:操作系统底层对应的都是机器码010101 不同的操作系统底层对应的机器码...
  • 1.概述JDK:java程序设计语言,java虚拟机,java API类库为API为JDK,是支持java程序开发的最小环境JRE:java API类库的java SE子集和java虚拟机是JRE,是支持程序运行的标准环境 JDK 1.7 的主要改进:新的G1收集...
  • 编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基JVM[Java的运行原理 在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了...
  • 1:类加载器 ...虚拟机启动时创建的JAVA堆,他是java程序最要的工作内存区域,几乎所有对象的创建实例都在堆中,堆空间是线程共享的。 4:直接内存 java的NIO库允许java程序使用直接内存,从...
  • 1,什么是JVM虚拟机呢? JVM是java虚拟机的一个缩写, jvm是一种"用于计算设备的规范",它是人们虚拟出来的计算机,是人们模仿各种计算机计算功能来实现的.Java虚拟机包含 一套字节码的指令集,一组寄存器,一个...
  • 自动内存管理机制Java虚拟机原理所谓虚拟机,就是一台虚拟的机器。他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box、Vmare就属于系统虚拟机,他们...
  • 1991年,在Sun公司工作期间,詹姆斯·高斯林和一群技术人员创建了一个名为Oak的项目,旨在开发运行虚拟机的编程语言,允许程序多平台上运行。后来,这项工作就演变为Java。随着互联网的普及,尤其是网景开发的网页...
  • 自动内存管理机制Java虚拟机原理所谓虚拟机,就是一台虚拟的机器。他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box、Vmare就属于系统虚拟机,他们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,154
精华内容 1,261
关键字:

jvm虚拟机运行原理