J V M大概理解
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大概理解的更多相关文章
- 关于Mysql数据库longblob格式数据的插入com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V问题分析
当数据库字段为blob类型时 ,我们如果使用PreparedStatement中的setBinaryStream(int,InputStream,int)方法需要注意 在向blob字段类型中插入数据时 ...
- Javascript J更深层次的理解avascript 基础知识
eval全局函数 dojo loader会看到如下的功能 var eval_ = new Function('return eval(arguments[0]);'); //Function 函 ...
- 对仿真glbl.v文件的理解
Simulation, UniSim, SimPrim - How do I use the "glbl.v" module in a Verilog simulation? De ...
- jQuery.each的function中有哪些参数(可以大概理解function中的参数问题)
1.没有参数 $("img").each(function(){ $(this).toggleClass("example"); }); 1 2 3 2.有一个 ...
- docker大概理解
#是啥# 轻量级的虚拟机,占用资源远小于一般意义上的虚拟机(例如:vmware,hyper-v) #特点# 启动快,体积小,开销少 #本质# Linux容器的一种封装 参考: 阮一峰博客 http:/ ...
- 一步一步深入理解Dijkstra算法
先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...
- 全面理解Git
前言 人生贵知心,定交无暮早. 原文博客地址:Git命令总结 知乎专栏&&简书专题:前端进击者(知乎) 前端进击者(简书) 正文 1.Git简介 Git的诞生确实是一个有趣的故事,我 ...
- Unity Animator动画状态机 深入理解(一)
接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...
- Sql Server之旅——第六站 使用winHex利器加深理解数据页
这篇我来介绍一个winhex利器,这个工具网上有介绍,用途大着呢,可以用来玩数据修复,恢复删除文件等等....它能够将一个file解析成 hex形式,这样你就可以对hex进行修改,然后你就可以看到修复 ...
- (5) 深入理解Java Class文件格式(四)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21658415 前情回顾 在上一篇博客深入理解Java Class文件格式(三) 中, ...
随机推荐
- Xilinx XPM使用说明--XPM_MEMORY_SDPRAM
XPM_MEMORY_SDPRAM 参数化宏:简单的双端口RAM 介绍 此宏用于实例化简单双端口RAM.端口A用于从存储器执行写入操作,端口B可用于从存储器读取. 下面介绍XPM_MEMORY实例的基 ...
- 异常:java.sql.SQLException: HOUR_OF_DAY: 0 -> 1解决
问题:Error attempting to get column 'xxTime' from result set. Cause: java.sql.SQLException: HOUR_OF_DA ...
- ChatGPT is at capacity right now.ChatGPT Plus subscriber login Add your email for a personalized login link的解决办法
原因 你的ip地区用的人过多. 解决办法 在右侧页面填入邮箱,能收到邮件立刻就能登录,如果没有,就换地区试试,不行就等等吧 邮件示例:
- ubuntu docker pull 失败 Error response from daemon: Get https://registry-1.docker.io/v2/
问题: ubuntu@VM-3-4-ubuntu:~$ docker pull tensorflow/tensorflow:2.3.4-gpuError response from daemon: G ...
- Ubuntu磁盘查看分区和挂载
1.查看硬盘 sudo lshw -c disk 查看有多少个硬盘,一般会显示 disk:0(设备名为 /dev/vda) disk:1 (设备名为 /dev/vdb) 2.查看分区 sudo fdi ...
- python实现两张图片拼接
纵向拼接 from PIL import Image def image_splicing(pic01, pic02): """ 图片拼接 :param pic01: 图 ...
- vue element 日期范围选择器限制:只能选今天之前的时间 || 只能选今天之后的时间 || 选取今天往后三天内
举例:只能选今天或者今天之后的时间(如下图) <el-date-picker clearable v-model="form.limitTime" type="da ...
- python日志logging配置
python日志logging配置 为了方便ELK收集日志,将日志打印成json格式 开发过程中,使用json格式不方便排查问题 本文章使用python的logging模块,一步步增加配置,来说明每个 ...
- CSS控制背景图片100%自适应填充布局
原文地址:http://blog.csdn.net/wd4java/article/details/50537562 .personal_head { width: 100%; height: 35% ...
- 将pyinstaller打包的exe文件制作成安装包
1. 下载安装 inno setup (下载地址:http://www.jrsoftware.org/isdl.php) 2. 配置inno setup中文语言包 inno setup默认并没有中文, ...