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 的一部分。
这三者的关系可以如下图所示:

了解这三者之间的关系可以为我们解决一些线上问题打下基础。例如线上发生了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 个字节。
JVM技术周报第2期的更多相关文章
- JVM技术周报第1期
JVM技术周报 · 第1期 JVM技术每周分享整理了JVM技术交流群每周讨论的内容,由群内成员整理归纳而成.如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友, ...
- iOS移动开发周报-第24期
iOS移动开发周报-第24期 [摘要]:本期iOS移动开发周报带来如下内容:苹果更新了iTunes Connect的设计.UIKit Dynamics 教程:抛掷 Views.iOS APP 架构漫谈 ...
- iOS移动开发周报-第19期
iOS移动开发周报-第19期 前言 欢迎国内的iOS同行或技术作者向我提交周报线索,线索可以是新闻.教程.开发工具或开源项目,将相关文章的简介和链接在微博上发布并 @唐巧_boy 即可. [摘要]:本 ...
- iOS移动开发周报-第17期
lhq iOS移动开发周报-第17期 前言 欢迎国内的iOS同行或技术作者向我提交周报线索,线索可以是新闻.教程.开发工具或开源项目,将相关文章的简介和链接在微博上发布并 @唐巧_boy 即可. [摘 ...
- iOS移动开发周报-第25期
iOS移动开发周报-第25期 [摘要]:本期iOS移动开发周报带来如下内容:苹果发布 iPhone6 和 Apple Watch.Swift 1.0 GM发布.Xcode 6支持PDF Vector作 ...
- iOS移动开发周报-第23期
iOS移动开发周报-第23期 [摘要]:本期iOS移动开发周报带来如下内容:苹果发出9月9日发布会邀请函,AFNetworking2.0源码解析,objc与鸭子对象,Protecting iOS Ap ...
- iOS移动开发周报-第22期
iOS移动开发周报-第22期 [摘要]:本期iOS移动开发周报带来如下内容:苹果股价创新高,iOS8自动调整UITableView布局,Swift学习心得等. 新闻 <苹果股价创新高 市值全球第 ...
- iOS移动开发周报-第21期
iOS移动开发周报-第21期 [摘要]:本期iOS移动开发周报带来如下内容:苹果iCloud中国数据转存中国电信,Swift Operators,100 个 Swift 必备 tips,FLEXLoa ...
- 极客技术专题【008期】:CSS3核心技术:选择器
日期:2013-8-19 来源:GBin1.com 技术专题介绍 技术专题:CSS3核心技术:选择器 专题演讲稿:CSS3选择器 分享人:知名前端技术博客 - w3cplus.com 博主 - 大漠 ...
随机推荐
- window平台搭建Hudson服务器
1.1 环境 Microsoft Windows server 2008 x64 1.2 资源下载 TortoiseSVN-1.7.11.23600-x64-svn-1.7.8.msi h ...
- NaviCat SqlServer Windows 10 Update 1803 IM004 - Driver's SQLAllocHandle on SQL_HANDLE_ENV failed
安装Windows 10 Update 1803后,Navicat连接SqlServer出现以下错误: IM004 - Driver's SQLAllocHandle on SQL_HANDLE_EN ...
- python自学——集合
#皇城根儿#集合:是无序的.不重复的:1.去重:2.关系测试#创建集合#创建数字集合number=set([1,3,5,7,9]) #数字型集合str_type=set(["im" ...
- 50家硅谷IT公司技术博客
分享一下 50 家硅谷优秀 IT 公司技术博客,从中可以了解企业文化,技术特色和设计语言,如果直接列出来很单调,加上点评,算吐槽版吧. 知名大厂 1. Facebook https://www.f ...
- 【转】Java十大常用框架介绍(spring系+dubbo+RabbitMQ+Ehcache+redis)
一.SpringMVC Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动 ...
- Django基础必会套装
from django.shortcuts import HttpResponse, render, redirect 1. HttpResponse('OK') --> 把字符串的OK转成二进 ...
- 乘风破浪:LeetCode真题_023_Merge k Sorted Lists
乘风破浪:LeetCode真题_023_Merge k Sorted Lists 一.前言 上次我们学过了合并两个链表,这次我们要合并N个链表要怎么做呢,最先想到的就是转换成2个链表合并的问题,然后解 ...
- ArcGIS API for JS4.7加载FeatureLayer,点击弹出信息并高亮显示
我加载的是ArcGIS Server本地发布的FeatureService,ArcGIS API for JS4.7记载FeatureLayer时,在二维需要通过代码启用WebGL渲染,在三维模式下, ...
- 1036. [ZJOI2008]树的统计【树链剖分】
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...
- 使用Tensorflow训练自己的数据
训练自己的数据集(以bottle为例): 1.准备数据 文件夹结构: models ├── images ├── annotations │ ├── xmls │ └── trainval.txt ...