JVM技术周报第2期

JVM技术周报第2期

JVM技术周报分享JVM技术交流群的讨论内容,由群内成员整理归纳而成。如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友,获取入群详情。

1、如何阅读源码?

在我的一个JVM技术交流群里,有人抛出了这样一个问题:

经典框架的源码要怎么读容易些啊?比如spring,mybatis这种。

对于这个问题,群友进行了激烈的讨论。

“源码”,作为菜鸟的我真是还没有想法到这一步,现在总是感觉我做的东西离这个还远呢,根本用不到,看这个干嘛。有时间不如看看别的。源码看了又看不懂,就先不看了吧。然后就这样“说服”自己,避开源码那一块。但是实际上已经工作了两年的我不应该再这样继续昏昏沉沉下去了,虽然我的理想很“丰满”,但是现实……。最近又受了大佬的影响,我自己也想慢慢尝试阅读源码。那么问题来了。如何下手?看哪些?怎么看?

【源码如何“下手”】

我个人认为是先看同事写的代码,因为一个项目总是一个团队完成的,而不是一个人,有的时候在遇到bug的时候,那个bug不一定是你写的,而是别人的代码造成了,那么需要你修复的时候,那这个时候其实就是相当于在看源码,这一步就是开始在看“源码”了。因为所谓的框架的源码也都是别人写的,只不过别人的确实比较“niubility”。

【该看那些源码呢】

在平时做项目时候,我相信String大家都见过的吧。那就先从String这个常见的源码开始。里面一些常用的方法,如:equals、valueOf、length等

【该怎么看呢】

知道了看哪些源码以后,那么该怎么看呢?实际上“看”真的不仅仅是看,你需要仔细看,反复看,然后是自己尝试写,因为你看的再熟悉,哪怕你背出来了,你真不一定能写出来。换句话说,你需要实践,俗话说“实践出真知嘛”,那“能动手就别走着瞧”了。

【大佬们的经验】

刚开始看的时候不要每一行都看,因为你真的不是每一行都能看懂的,最好像String那样,你能会用一些了,然后再分析,然后仿照一些方法自己尝试写来。有些晦涩难懂的就直接跳过,后期再看,不然硬生生强调“都看完了”那没什么用,那也就是在自欺欺人,这样的毅力我们是不需要的。我们需要的是有效那部分。再强调下, 刚开始看千万不要追求每一行都看懂。

我这里将讨论的结论总结一下:

  • 不要追求每行都看懂,而是先看懂框架。不要在不懂的地方过度消耗自己的精力。
  • 要善于学习别人的文章,善于请教别人。
  • 需要找到入口,之后再摸着绳子去阅读。
  • 要有长期作战的心理准备,而不是几天、几周的时间就搞定。
  • 要学会画UML图,通过UML图梳理源码结构。

2、Native Memory、Heap Memory 和 Direct Memory之间的区别和联系

Native Memory 指的是本地内存,其实指的就是应用所运行机器的内存大小。更多时候指的是应用所运行操作系统分配给JVM的内存大小。Heap Memory 指的是JVM运行时数据区中定义的堆内存,其用来存放Java对象等共享的数据。Direct Memory 则是由于NIO产生而诞生的一块数据区,其用来加速IO的读取,其属于 Native Memory 的一部分。

这三者的关系可以如下图所示:

595137-20181125212421731-835043424.png

了解这三者之间的关系可以为我们解决一些线上问题打下基础。例如线上发生了OOM异常,但此时的Java堆使用率还很低,那么这时候你可能要怀疑是不是 Direct Memory 出了问题。

参考资料:

  • https://developer.ibm.com/answers/questions/235834/what-is-the-difference-between-native-heap-memory/
  • https://www.ibm.com/developerworks/library/j-nativememory-linux/

3、PC寄存器是什么?它在内存结构中的位置是属于哪里?

PC寄存器也叫程序计数器(Program Counter Register)指的是保存线程当前正在执行的方法。如果这个方法不是 native 方法,那么 PC 寄存器就保存 Java 虚拟机正在执行的字节码指令地址。如果是 native 方法,那么 PC 寄存器保存的值是 undefined。任意时刻,一条 Java 虚拟机线程只会执行一个方法的代码,而这个被线程执行的方法称为该线程的当前方法,其地址被存在 PC 寄存器中。它是运行时数据区的,属于线程的一部分,是线程私有的。

4、为什么0xCAFEBABE是4个字节?

为什么 0xCAFEBABE 是 4 个字节,而不是 8 个字节。我估计很多人搞不清楚。

首先,0xCAFEBABE 是十六进制,我想大家没有异议。对于十六进制的数据来说,它们每位能存储16个值,这就相当于二进制的 4 个位,也就是说 0x0F = 1111 = 15(十进制)。也就是说一个十六进制位相当于二进制的4个位(bit)。

那么两个 16 进制位,是不是相当于 8 个位,8 bit。

那么 8 bit = 1 字节。所以两位 16 进制 = 1 字节。

所以 CAFE = 2字节,BENE = 2 字节。

一共 4 个字节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最长重复子串和最长不重复子串求解

最长重复子串和最长不重复子串求解 本文内容框架: 1 最长重复子串 基本方法、KMP算法求解、后缀数组求解 2 最长不重复子串 基本方法、动态规划、动态规划Hash 3 小结 1最长重复子串 1.1问题描述 首先这是一个单字符串问题。子字符串R 在字符串L 中至少出现两…

前后端分离——token超时刷新策略

前言 记录一下前后端分离下————token超时刷新策略! 需求场景 昨天发了一篇记录 前后端分离应用——用户信息传递 中介绍了token认证机制,跟几位群友讨论了下,有些同学有这么一个疑惑:token失效了,应该怎么做&…

阿里云@广东:让我们一起上云!

锅炉故障预测 预警准确率95%以上 利用算法模型进行制程能力的 综合分析与评估优化 提升定标效率 时间降低30% 构建垃圾焚烧发电工艺的优化算法模型 综合考虑环保和设备负荷因素 推荐最优工艺参数组合 优化人工操作,提高燃烧效率 中海油能源发展公司 石油钻探预测优化…

weblogic jprofile配置

前提: 1.安装好weblogic 2.安装好jprofile 非等待模式: export JAVA_OPTIONS"${JAVA_OPTIONS} -Dweblogic.threadpool.MinPoolSize100 -Dweblogic.threadpool.MaxPoolSize1000 -Djava.awt.headlesstrue -agentpath:/opt/jprofiler9/bin/linux-x64/l…

音视频引擎研究

音视频包:http://ishare.iask.sina.com.cn/f/33851582.html 1、WebRTC目的 WebRTC(Web Real-Time Communication)项目的最终目的主要是让Web开发者能够基于浏览器(Chrome\FireFox\...)轻易快捷开发出丰富的实时多媒体应…

潭州课堂25班:Ph201805201 django 项目 第三十九课 后台 文章发布,图片上传到 FastDFS后端实现 七牛云讲解(课堂笔记)...

文章发布: # 1,从前台获取参数# 2,校验参数# 3,把数据保存到数据库# 4,返回执行结果到前台,(创建成功或失败)自定义 froms.py 校验参数 上传图片到七牛云 注册 https://www.qiniu.c…

原来公司需要这样的你

担任项目经理也有几年的时间了,项目组里来了不少的刚毕业或者工作时间不长的年轻人,有精明能干的,有中庸无为的也有自暴自弃混日子的,但再优秀的年轻人也会犯这样那样的错误,我总结起来一般就是以下这些问题&#xff0…

git使用—rebase还是merge

转载自:https://segmentfault.com/q/1010000007704573/ 我猜现实中的情况是这样的: 使用 git 的人群中,不会用 rebase(哪怕是基础功能的)的至少一半(这个估计恐怕很保守了) 剩下一半里真正理解…

淘宝网轮播图

转载于:https://www.cnblogs.com/wxwxwx/p/10264370.html

atob和btoa的趣谈

2019独角兽企业重金招聘Python工程师标准>>> 不了解的人突然看到window对象的atob和btoa 函数,估计会认为哪个臭小子添加全局函数了。 你如果告诉他这是原生函数,他一定会怒骂:哪个脑残给api起个这样的名子。 你能猜出来这两个函数…

esp32使用lvgl,给图片取模显示图片

使用LVGL官方工具。 https://lvgl.io/tools/imageconverter 上传图片,如果想要透明效果,那么选择 输出格式C array,点击Convert进行转换。 下载.c文件放置到工程下使用即可。

ASM 判定一个类,实现了指定接口

为什么80%的码农都做不了架构师?>>> ASM 判定一个类,实现了指定接口 技术支持 ASM 中,ClassReader 类:对已存在的进行解析,并提供获取类信息的方法。 通过 ClassReader ,实现对一个类的解析。 …

exgcd模板

逆元模板P1082 1 #include <cstdio>2 #include <algorithm>3 4 int exgcd(int a, int b, int &x, int &y) {5 if(!b) {6 x 1;7 y 0;8 return a;9 } 10 int g exgcd(b, a % b, x, y); 11 std::swap(x, y); 12 …

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案ASP.NET Core 从2.2版本开始&#xff0c;采用了一个新的名为Endpoint的路由方案&#xff0c;与原来的方案在使用上差别不大&#xff0c;但从内部运行方式上来说…

用jenkins创建节点

原料&#xff1a;(1)jre下载链接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html (2)jdk:下载链接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 一、创建SLAVE节点…

解决 Script Error 的另类思路

2019独角兽企业重金招聘Python工程师标准>>> 本文由小芭乐发表 前端的同学如果用 window.onerror 事件做过监控&#xff0c;应该知道&#xff0c;跨域的脚本会给出 "Script Error." 提示&#xff0c;拿不到具体的错误信息和堆栈信息。 这里读者可以跟我一…

迅雷影音怎样 1.5倍速度播放

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 看视频 觉得播放速度太慢&#xff0c;想让1.5速度播放可以这样设置&#xff1a; 点击快进按钮&#xff0c;点一次变为1.1倍&#xff0c…

git pull时冲突的几种解决方式

仅结合本人使用场景&#xff0c;方法可能不是最优的 1. 忽略本地修改&#xff0c;强制拉取远程到本地 主要是项目中的文档目录&#xff0c;看的时候可能多了些标注&#xff0c;现在远程文档更新&#xff0c;本地的版本已无用&#xff0c;可以强拉 git fetch --allgit reset --h…

Linux:echo命令详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 echo命令 用于字符串的输出 格式 echo string使用echo实现更复杂的输出格式控制 1.显示普通字符串: echo "It is a test"这里…

学习 shell脚本之前的基础知识

见 : http://www.92csz.com/study/linux/12.htm【什么是shell】 简单点理解&#xff0c;就是系统跟计算机硬件交互时使用的中间介质&#xff0c;它只是系统的一个工具。实际上&#xff0c;在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方&#xff0c;如果把计算…