jvm的大致流程:他把一个Class文件 通过类加载机制 装载到jvm里面,然后放到不同的运行时数据区(Runtime Data Areas),通过编译器来编译。

第一部分,我们可以关注class文件的格式,比如说其中的常量池,成员变量,方法等等。这样就能够知道java源码内容在class文件中的表示方式。

第二部分,是Class Loader Subsystem,也就是类加载机制,class文件加载到内存中,需要借助java中的类加载机制。类加载机制呢,分为装载、链接和初始化,它主要就是对类进行查找、验证以及分配相关内存空间和赋值。

第三部分,Runtime Data Areas也就是我们通常所说的运行时数据区,他解决的问题是class文件进入内存之后,该如何进行存储不同的数据,以及数据该如何进行扭转。比如1. Method Area 通常会存储由class文件常量池所对应的运行时常量池、字段和方法的元数据信息、类的模板信息等等。2. Heap 是存储各种Java中的对象实例。3. Java Threads 通过线程以栈的方式去运行加载各个方法。3. Native Internal Thread 可以理解为是加载运行 native 类型的方法。4. PC Registers(Program Counter)呢 则是保存每个线程执行方法的实时地址,这样通过运行时数据区的五个部分就能很好的去把数据存储和运行起来。

第四部分,Garbage Collector是我们的垃圾回收器,就是对运行时数据区中的数据进行管理和回收。回收机制可以基于不同的垃圾收集器,比如说 Serial、Parallel、CMS、G1、ZGC等。可以针对不同业务场景去选择不同的收集器,只需要通过jvm 参数设置即可。如果我们去打开,Hotspot的一个源码,可以发现这些收集器,其实就是对于不同垃圾收集算法的实现,核心的算法呢有三个,第一个是标记-清除,第二个是标记-整理,第三个是复制。

第五部分, JIT Compiler 和 Interpreter通俗的理解就是编译器。Class的字节码指令通过JIT Compiler 和 Interpreter翻译成对应操作系统的CPU指令,只不过呢,可以选择解释执行或者编译执行。在HotSpot的虚拟机中,默认采用的是这两种方式的组合。

第六部分,是JNI的技术,如果我们想去找到Java中的某个native方法,是如何通过C或C++实现的,那么可以通过,Native、Method、Interface来去进行查找,也就是我们所谓的JNI技术。通过官网给出的HotSpot架构图,我们就能够知道jvm的底层是如何运行的。当然在实际的操作过程中,我们可以去借助一些jvm的参数和一些jdk常见命令,我们就可以优雅的分析jvm出现的常见问题并对其进行优雅的调优。

J V M大概理解的更多相关文章

  1. 关于Mysql数据库longblob格式数据的插入com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V问题分析

    当数据库字段为blob类型时 ,我们如果使用PreparedStatement中的setBinaryStream(int,InputStream,int)方法需要注意 在向blob字段类型中插入数据时 ...

  2. Javascript J更深层次的理解avascript 基础知识

    eval全局函数 dojo loader会看到如下的功能    var eval_ = new Function('return eval(arguments[0]);'); //Function 函 ...

  3. 对仿真glbl.v文件的理解

    Simulation, UniSim, SimPrim - How do I use the "glbl.v" module in a Verilog simulation? De ...

  4. jQuery.each的function中有哪些参数(可以大概理解function中的参数问题)

    1.没有参数 $("img").each(function(){ $(this).toggleClass("example"); }); 1 2 3 2.有一个 ...

  5. docker大概理解

    #是啥# 轻量级的虚拟机,占用资源远小于一般意义上的虚拟机(例如:vmware,hyper-v) #特点# 启动快,体积小,开销少 #本质# Linux容器的一种封装 参考: 阮一峰博客 http:/ ...

  6. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  7. 全面理解Git

    前言 人生贵知心,定交无暮早. 原文博客地址:Git命令总结 知乎专栏&&简书专题:前端进击者(知乎)  前端进击者(简书) 正文 1.Git简介 Git的诞生确实是一个有趣的故事,我 ...

  8. Unity Animator动画状态机 深入理解(一)

    接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...

  9. Sql Server之旅——第六站 使用winHex利器加深理解数据页

    这篇我来介绍一个winhex利器,这个工具网上有介绍,用途大着呢,可以用来玩数据修复,恢复删除文件等等....它能够将一个file解析成 hex形式,这样你就可以对hex进行修改,然后你就可以看到修复 ...

  10. (5) 深入理解Java Class文件格式(四)

    转载:http://blog.csdn.net/zhangjg_blog/article/details/21658415 前情回顾   在上一篇博客深入理解Java Class文件格式(三) 中, ...

随机推荐

  1. Mogeaver 连接数据库

    下载安装Mogeaver是一款开源软件,下载地址如下:https://docs.mogdb.io/zh/mogdb/v3.0/mogeaver-release-notes 根据您的操作系统选择相应的安 ...

  2. CF1137F Matches Are Not a Child's Play 题解

    以最后被删去的点为根,这样子不会存在从父亲然后删掉某个点,儿子的删除顺序一定比父亲前. 记每个点子树中的最大值为 \(f_x\),那么一个点的排名,首先就需要加上 \(<f_x\) 的所有值,记 ...

  3. mysql查询最近2天数据

    SELECT * FROM jk_dzbl_zybrbljlb where jlrq >= now()-interval 2 day

  4. celery+redis的使用(异步任务、定时任务)

    目录 celery理解 安装celery+redis 异步任务使用 1.基础使用 新建task.py文件 在项目文件目录下执行python交互式编程 在项目文件目录下创建worker消费任务 2.使用 ...

  5. Ubuntu20.04 安装RabbitMQ 亲测可行

    添加Erlang repository: sudo add-apt-repository -y ppa:rabbitmq/rabbitmq-erlang 添加RabbitMQ repository: ...

  6. 前端 ArrayBuffer 与 Blob 互转

    我们在使用ajax向后端发送请求时,responseType可以设置返回数据的格式,它支持的格式有"text"."arraybuffer"."blob ...

  7. 【面试题】 webpack面试篇

    1.与webpack类似的工具还有哪些?谈谈你为什么选择webpack? grunt 优点:出现的比较早,第一代打包工具 缺点:配置项太多,只有一个配置文件,而且不同的插件可能有自己的配置字段,学习成 ...

  8. datax clickhousewriter插件下载 elasticsearchwriter插件下载

    有用点手推荐!!! clickhousewriter: 链接:https://pan.baidu.com/s/1_dx7Y1P31yScNQvz0UH2WA 提取码:cwvv elasticsearc ...

  9. 一些JVM指令

    1.jps:查看本机java进程信息. 2 .jstack:打印线程的栈信息,制作线程dump文件. 3.jmap:打印内存映射,制作堆dump文件 4.jstat:性能监控工具 5.jhat:内存分 ...

  10. Excel列动态导出

    列动态导出的Excel,大致整了一下,没有过多深入. 1.首先定义列样式 package a.b.common.util.excel.stream; import java.util.Objects; ...