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. SpringBoot 面试问答总结(VIP典藏版),最详细!全面!爆肝!

    最详细的SpringBoot面试问题干货,点赞收藏慢慢看 1.SpringBoot 面试问答总结 Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主 ...

  2. 补充人物pawn的旋转方向

    先找到控制pawn的控制器的Rotation GetControlRotaion() 然后获得控制器的Z轴旋转 创建新的Rotator YawRotaion(0,GetControlRotaion() ...

  3. LCD1602液晶屏

    单片机系统用到的液晶屏(简称LCD)有很多类型,最常用的有两种,一种是1602型(即每行可显示16个字符,同时能显示2行),另一种是12864型(即每行可显示128个点,每列可显示64个点).一般前一 ...

  4. chm文档生成->Sandcastle使用帮助

    1.介绍 Sandcastle是微软提供的开源的,用于生成.net文档帮助的工具. 源代码路径:https://github.com/EWSoftware/SHFB,进去后能找到Relase版本的路径 ...

  5. Python实现XX短视频加密算法抓包分析及刷邀请

    Python实现XX短视频加密算法抓包分析及刷邀请 出自:https://zhuanlan.zhihu.com/p/466929667?utm_id=0 Python彳余 一个会常常更新互联网,编程的 ...

  6. mybatis日志打印到控制台

    mybatis: configuration:# 日志输出到控制台 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

  7. python调用c/c++方法

    # python调用c/c++方法:一般先将c++代码转化为C类型dll(推荐使用静态dll,否则容易出现各种链接库问题;记得使用extern "C" _declspec(dlle ...

  8. [jQuery]判断页面是否滚动到底部

    方法1:判断可见高度+滚动高度是否等于内容高度 但经过测试UC.QQ.华为浏览器,这个方法不生效.(打印查因:可能由于屏幕缩放,可见高度和滚动高度会偏小. $(this).scroll(functio ...

  9. BDD测试和TDD测试

    BDD测试和TDD测试 TDD TDD是测试驱动开发(Test-Driven Development)的缩写,是敏捷开发中的一项测试技术,也是一种设计方法论.她的大概思路是:先针对每个功能点抽象出接口 ...

  10. CentOS6.8安装docker教程

    在VMware新安装CentOS6.8系统 CentOS6.8可在阿里镜像库下载: https://mirrors.aliyun.com/centos-vault/6.8/isos/x86_64/ 在 ...