Java虚拟机 平行系列一xiang

目录

相关视频:

相关文章:

Java SE体系架构

JVM整体介绍:

运行时数据区:

程序计数器:

虚拟机栈:

虚拟机栈图解:

开启HSDB工具:

运行时数据区:

虚拟机栈和本地方法栈

 寻找本地方法区:

堆内存区域:

深入辨析堆和栈:

线程共享区域:

JMM(JVM内存模型):


相关视频:

深入理解Java虚拟机(JVM性能调优+内存模型+虚拟机原理)

相关文章:

Java字节码指令收集大全

JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。
JRE是Java Runtime Environment缩写,指Java运行环境。
JVM是Java Virtual Machine(Java虚拟机)的缩写

(基于King的视频)

Java SE体系架构

JVM整体介绍:

java(javac)--> class文件(JVM把class文件翻译成机器码) --> Linux、Windows等平台(只认识机器码101010)。

JVM可以理解为一个翻译,把class文件翻译成机器码,所以JVM具有跨平台性。

运行时数据区:

程序计数器:

虚拟机栈:

虚拟机栈图解:

JavaStack.java
public class JavaStack {
    //静态变量
    static String Ls = "xxx洗浴中心";
    //常量
    final String Fs = "所有服务只要80元";

    public void king() {
        //13号技师
        Object tech13 = new Object();
        //我又两个账户
        //局部变量,支付宝余额
        int zhifubao = 50;
        //局部变量,微信余额
        int weixin = 50;
        //判断逻辑,如果金额大于80
        if (zhifubao + weixin > 80) {
            //调用一次非常特殊的服务
            tech13.hashCode();
            zhifubao = zhifubao - 50;
            weixin = weixin - 30;
        }
    }

    public static void main(String[] args) {
        JavaStack javaStack = new JavaStack();
        javaStack.king();
    }

}

在IDEA中,找到对应的编译的class文件

进行如上反编译,得到一个TXT文件,打开后得到:

Classfile /D:/idea_ws/.../JavaStack.class
  Last modified 2019-5-21; size 930 bytes
  MD5 checksum ...
  Compiled from "JavaStack.java"
public class com.ph.jvm.JavaStack
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #4.#38         // java/lang/Object."<init>":()V
   #2 = String             #39            // 所有服务只要80元
   #3 = Fieldref           #6.#40         // com/ph/jvm/JavaStack.Fs:Ljava/lang/String;
   #4 = Class              #41            // java/lang/Object
   #5 = Methodref          #4.#42         // java/lang/Object.hashCode:()I
   #6 = Class              #43            // com/ph/jvm/JavaStack
   #7 = Methodref          #6.#38         // com/ph/jvm/JavaStack."<init>":()V
   #8 = Methodref          #6.#44         // com/ph/jvm/JavaStack.king:()V
   #9 = String             #45            // xxx洗浴中心
  #10 = Fieldref           #6.#46         // com/ph/jvm/JavaStack.Ls:Ljava/lang/String;
  #11 = Utf8               Ls
  #12 = Utf8               Ljava/lang/String;
  #13 = Utf8               Fs
  #14 = Utf8               ConstantValue
  #15 = Utf8               <init>
  #16 = Utf8               ()V
  #17 = Utf8               Code
  #18 = Utf8               LineNumberTable
  #19 = Utf8               LocalVariableTable
  #20 = Utf8               this
  #21 = Utf8               Lcom/ph/jvm/JavaStack;
  #22 = Utf8               king
  #23 = Utf8               tech13
  #24 = Utf8               Ljava/lang/Object;
  #25 = Utf8               zhifubao
  #26 = Utf8               I
  #27 = Utf8               weixin
  #28 = Utf8               StackMapTable
  #29 = Class              #41            // java/lang/Object
  #30 = Utf8               main
  #31 = Utf8               ([Ljava/lang/String;)V
  #32 = Utf8               args
  #33 = Utf8               [Ljava/lang/String;
  #34 = Utf8               javaStack
  #35 = Utf8               <clinit>
  #36 = Utf8               SourceFile
  #37 = Utf8               JavaStack.java
  #38 = NameAndType        #15:#16        // "<init>":()V
  #39 = Utf8               所有服务只要80元
  #40 = NameAndType        #13:#12        // Fs:Ljava/lang/String;
  #41 = Utf8               java/lang/Object
  #42 = NameAndType        #47:#48        // hashCode:()I
  #43 = Utf8               com/ph/jvm/JavaStack
  #44 = NameAndType        #22:#16        // king:()V
  #45 = Utf8               xxx洗浴中心
  #46 = NameAndType        #11:#12        // Ls:Ljava/lang/String;
  #47 = Utf8               hashCode
  #48 = Utf8               ()I
{
  static java.lang.String Ls;
    descriptor: Ljava/lang/String;
    flags: ACC_STATIC

  final java.lang.String Fs;
    descriptor: Ljava/lang/String;
    flags: ACC_FINAL
    ConstantValue: String 所有服务只要80元

  public com.ph.jvm.JavaStack();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: ldc           #2                  // String 所有服务只要80元
         7: putfield      #3                  // Field Fs:Ljava/lang/String;
        10: return
      LineNumberTable:
        line 3: 0
        line 7: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      11     0  this   Lcom/ph/jvm/JavaStack;

  public void king();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=4, args_size=1
         0: new           #4                  // class java/lang/Object
         3: dup
         4: invokespecial #1                  // Method java/lang/Object."<init>":()V
         7: astore_1
         8: bipush        50
        10: istore_2
        11: bipush        50
        13: istore_3
        14: iload_2
        15: iload_3
        16: iadd
        17: bipush        80
        19: if_icmple     37
        22: aload_1
        23: invokevirtual #5                  // Method java/lang/Object.hashCode:()I
        26: pop
        27: iload_2
        28: bipush        50
        30: isub
        31: istore_2
        32: iload_3
        33: bipush        30
        35: isub
        36: istore_3
        37: return
      LineNumberTable:
        line 11: 0
        line 14: 8
        line 16: 11
        line 18: 14
        line 20: 22
        line 21: 27
        line 22: 32
        line 25: 37
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      38     0  this   Lcom/ph/jvm/JavaStack;
            8      30     1 tech13   Ljava/lang/Object;
           11      27     2 zhifubao   I
           14      24     3 weixin   I
      StackMapTable: number_of_entries = 1
        frame_type = 254 /* append */
          offset_delta = 37
          locals = [ class java/lang/Object, int, int ]

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: new           #6                  // class com/ph/jvm/JavaStack
         3: dup
         4: invokespecial #7                  // Method "<init>":()V
         7: astore_1
         8: aload_1
         9: invokevirtual #8                  // Method king:()V
        12: return
      LineNumberTable:
        line 28: 0
        line 29: 8
        line 30: 12
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      13     0  args   [Ljava/lang/String;
            8       5     1 javaStack   Lcom/ph/jvm/JavaStack;

  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: ldc           #9                  // String xxx洗浴中心
         2: putstatic     #10                 // Field Ls:Ljava/lang/String;
         5: return
      LineNumberTable:
        line 5: 0
}
SourceFile: "JavaStack.java"

上图红框中就是程序计数器所记录的东西。 之所以是不连续的,是因为jvm在加载方法的同时还会做一些其他不可见的操作。

开启HSDB工具:

sa-jdi.jar

 打开cmd命令:

 java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB

输入该命令后,显示一个界面:

说明启动成功。

运行代码:

public class JVMObject {
    public final static String MAN_TYPE = "man"; // 常量
    public static String WOMAN_TYPE = "woman";  // 静态变量

    public static void  main(String[] args)throws Exception {//栈帧
        Teacher T1 = new Teacher();//堆中   T1 是局部变量
        T1.setName("Mark");
        T1.setSexType(MAN_TYPE);
        T1.setAge(36);
        for (int i=0;i<15;i++){//进行15次垃圾回收
            System.gc();//垃圾回收
        }
        Teacher T2 = new Teacher();
        T2.setName("King");
        T2.setSexType(MAN_TYPE);
        T2.setAge(18);
        Thread.sleep(Integer.MAX_VALUE);//线程休眠很久很久
    }
}

class Teacher{
    String name;
    String sexType;
    int age;//堆

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getSexType() {
        return sexType;
    }
    public void setSexType(String sexType) {
        this.sexType = sexType;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

运行时数据区:

 找到进程ID:

 继续使用HSDB工具:

输入ID:16028

 然后就可以看到JVM启动的所有线程:

 查看main线程:

如下:

虚拟机栈和本地方法栈

 可以看到sleep方法,这个是native方法,是本地方法栈的东西:

可以看到main线程,这个是main的栈帧,这是虚拟机栈的东西:

 从上面也可以看出:HotSpot直接把本地方法栈和虚拟机栈合二为一。

 寻找本地方法区:

接下来在HSDB工具中找到方法区,即找到 .class

 入口:

视图:

 根据路径:

 点进去就可以找到 Teacher.class的两个对象:

详细信息:

堆内存区域:

Heap Parameters:
ParallelScavengeHeap [

PSYoungGen [

eden =  [0x00000000d5c00000,0x00000000d5f40070,0x00000000d7c80000] ,

from =  [0x00000000d7c80000,0x00000000d7c80000,0x00000000d8180000] ,

to =  [0x00000000d8180000,0x00000000d8180000,0x00000000d8680000]  

]

PSOldGen [  [0x0000000081400000,0x00000000814c4510,0x0000000086980000]  ]

 ] 

深入辨析堆和栈:

 

线程共享区域:

JMM(JVM内存模型):

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视频目录 第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,jre,jvm的关系 [免费观看] 00:20:48分钟 | 第4节jvm初体验-内存溢出问题的分析与解决 [免费观看] 00:17:59分钟 | 第5节jvm再体验-jvm可视化监控工具 [免费观看] 00:21:17分钟 | 第6节杂谈 [免费观看] 00:12:37分钟 | 第7节Java的发展历史00:27:24分钟 | 第8节Java的发展历史续00:02:27分钟 | 第9节Java技术体系00:08:46分钟 | 第10节jdk8的新特性00:07:31分钟 | 第11节lanmbda表达式简介00:07:02分钟 | 第12节Java虚拟机-classic vm00:06:06分钟 | 第13节Java虚拟机-ExactVM00:03:35分钟 | 第14节Java虚拟机-HotSpotVM00:04:23分钟 | 第15节Java虚拟机-kvm00:03:04分钟 | 第16节Java虚拟机-JRockit00:04:12分钟 | 第17节Java虚拟机-j900:04:23分钟 | 第18节Java虚拟机-dalvik00:02:20分钟 | 第19节Java虚拟机-MicrosoftJVM00:03:57分钟 | 第20节Java虚拟机-高性能Java虚拟机00:02:58分钟 | 第21节Java虚拟机-TaobaoVM00:03:06分钟 | 第22节Java内存区域-简介00:07:56分钟 | 第23节Java内存区域-Java虚拟机栈00:12:04分钟 | 第24节Java内存区域-程序计数器00:12:54分钟 | 第25节Java内存区域-本地方法栈00:02:39分钟 | 第26节Java内存区域-堆内存00:05:08分钟 | 第27节Java内存区域-方法区00:06:32分钟 | 第28节Java内存区域-直接内存和运行时常量池00:15:53分钟 | 第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第30节探究对象的结构00:13:47分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第32节垃圾回收-概述00:06:20分钟 | 第33节垃圾回收-判断对象是否存活算法-引用计数法详解00:14:08分钟 | 第34节垃圾回收-判断对象是否存活算法-可达性分析法详解00:07:09分钟 | 第35节垃圾回收算法-标记清除算法00:04:36分钟 | 第36节垃圾回收算法-复制算法00:14:35分钟 | 第37节垃圾回收算法-标记整理算法和分代收集算法00:05:24分钟 | 第38节垃圾收集器-serial收集器详解00:09:45分钟 | 第39节垃圾收集器-parnew收集器详解00:04:53分钟 | 第40节垃圾收集器-parallel收集器详解00:11:02分钟 | 第41节垃圾收集器-cms收集器详解00:14:58分钟 | 第42节最牛的垃圾收集器-g1收集器详解00:18:04分钟 | 第43节内存分配-概述00:04:23分钟 | 第44节内存分配-Eden区域00:22:51分钟 | 第45节内存分配-大对象直接进老年代00:06:42分钟 | 第46节内存分配-长期存活的对象进入老年代00:03:40分钟 | 第47节内存分配-空间分配担保00:04:54分钟 | 第48节内存分配-逃逸分析与栈上分配00:10:32分钟 | 第49节虚拟机工具介绍00:10:27分钟 | 第50节虚拟机工具-jps详解00:11:20分钟 | 第51节虚拟机工具-jstat详解00:09:20分钟 | 第52节虚拟机工具-jinfo详解00:05:03分钟 | 第53节虚拟机工具-jmap详解00:08:48分钟 | 第54节虚拟机工具-jhat详解00:08:10分钟 | 第55节虚拟机工具-jstack详解00:10:19分钟 | 第56节可视化虚拟机工具-Jconsole内存监控00:07:09分钟 | 第57节可视化虚拟机工具-Jconsole线程监控00:12:18分钟 | 第58节死锁原理以及可视化虚拟机工具-Jconsole线程死锁监控00:10:38分钟 | 第59节VisualVM使用详解00:08:03分钟 | 第60节性能调优概述00:11:22分钟 | 第61节性能调优-案例100:23:28分钟 | 第62节性能调优-案例200:10:05分钟 | 第63节性能调优-案例300:12:41分钟 | 第64节前半部分内容整体回顾00:15:41分钟 | 第65节Class文件简介和发展历史 [免费观看] 00:11:26分钟 | 第66节Class文件结构概述 [免费观看] 00:16:50分钟 | 第67节Class文件设计理念以及意义 [免费观看] 00:13:41分钟 | 第68节文件结构-魔数 [免费观看] 00:09:49分钟 | 第69节文件结构-常量池 [免费观看] 00:23:44分钟 | 第70节文件结构-访问标志 [免费观看] 00:11:36分钟 | 第71节文件结构-类索引00:11:26分钟 | 第72节文件结构-字段表集合00:13:21分钟 | 第73节文件结构-方法表集合00:10:06分钟 | 第74节文件结构-属性表集合00:18:23分钟 | 第75节字节码指令简介00:09:18分钟 | 第76节字节码与数据类型00:09:34分钟 | 第77节加载指令00:09:33分钟 | 第78节运算指令00:10:24分钟 | 第79节类型转换指令00:13:42分钟 | 第80节对象创建与访问指令00:09:38分钟 | 第81节操作树栈指令00:03:27分钟 | 第82节控制转移指令00:11:58分钟 | 第83节方法调用和返回指令00:06:37分钟 | 第84节异常处理指令00:09:44分钟 | 第85节同步指令00:07:34分钟 | 第86节类加载机制概述00:07:26分钟 | 第87节类加载时机00:13:15分钟 | 第88节类加载的过程-加载00:15:15分钟 | 第89节类加载的过程-验证00:10:24分钟 | 第90节类加载的过程-准备00:05:40分钟 | 第91节类加载的过程-解析00:14:04分钟 | 第92节类加载的过程-初始化00:19:41分钟 | 第93节类加载器00:22:41分钟 | 第94节双亲委派模型00:17:03分钟 | 第95节运行时栈帧结构00:08:46分钟 | 第96节局部变量表00:20:48分钟 | 第97节操作数栈00:08:36分钟 | 第98节动态连接00:02:56分钟 | 第99节方法返回地址和附加信息00:03:24分钟 | 第100节方法调用-解析调用00:09:49分钟 | 第101节方法调用-静态分派调用00:16:21分钟 | 第102节方法调用-动态分派调用00:09:02分钟 | 第103节动态类型语言支持00:09:27分钟 | 第104节字节码执行引擎小结00:03:38分钟 | 第105节总结与回顾00:10:55分钟
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值