Class文件结构&字节码指令_《深入理解Java虚拟机》读书笔记

6.3 Class类文件的结构

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。

Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数,后面的解析都要以这两种数据类型为基础。

无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。

是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表,它由表6-1所示的数据项构成。

Class文件格式

Java内存&GC_《深入理解Java虚拟机》读书笔记

第2章 Java内存区域与内存溢出异常

2.2 运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示:Java内存区域

2.2.1 程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。

由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存

Git submodule学习笔记

参考自Git官方文档:7.11 Git 工具 - 子模块

开始使用子模块

将一个已存在的 Git 仓库添加为正在工作的仓库的子模块

1
$ git submodule add <子模块仓库地址>

克隆含有子模块的项目

普通的git clone命令默认会包含子模块的目录,但其中还没有任何文件,需要执行2个命令:

1
# 初始化本地配置文件
$ git submodule init
# 从该项目中抓取所有数据并检出父项目中列出的合适的提交
$ git submodule update

更简单的方式:

1
# 会自动初始化并更新仓库中的每一个子模块
$ git clone --recursive <包含子模块的仓库地址>

《算法图解》读书笔记

算法图解 [美] Aditya Bhargava

1.2 二分查找
1.2.1 更佳的查找方式
一般而言,对于包含n 个元素的列表,用二分查找最多需要log2 n 步,而简单查找最多需要n 步。

1.3 大O表示法
1.3.1 算法的运行时间以不同的速度增加
仅知道算法需要多长时间才能运行完毕还不够,还需知道运行时间如何随列表增长而增加。这正是大O表示法的用武之地。

Data Binding学习笔记——Attribute Setters

这是Data Binding学习笔记的最后一篇,我觉得 Attribute Setters 的特性大大提高了Data Binding库的可用性、拓展性。以下主要翻译自官方文档。

Attribute Setters(属性Setter)

当一个View绑定的数据发生变动时,自动生成的binding类其实会根据xml中的binding表达式来调用View对应属性的 setter 函数。Data binding 框架内置了几种自定义赋值的方法。

Data Binding学习笔记——Data Objects

关于Data Binding的基本使用在上一篇文章中已经做了总结,接下来会着重介绍下Data Binding库中个人认为最重要的两个特性:Data ObjectsAttribute Setters。前者是真正能让我们实现数据-UI双向绑定的关键;后者则为我们提供了自定义UI控件数据绑定的可能性。

当然,至于Data Binding其他的特性诸如自定义Binding Class命名Views with IDs(此特性可以完全取代Butterknife啦)等,查阅官方文档可以了。

Data Binding学习笔记——基本使用

参考链接:
http://yanghui.name/blog/2016/02/17/data-binding-guide/
https://developer.android.google.cn/topic/libraries/data-binding/index.html

Data Binding是google推出的布局与数据做双向绑定的库。它是一个support library,可以在 Android 2.1 (API level 7+)以上的平台使用,同时Android Plugin for Gradle的版本必须是 1.5.0-alpha1 以上。

编译环境

build.gradle中添加:

1
2
3
4
5
6
android {
    ....
    dataBinding {
        enabled = true
    }
}

有一点要注意,如果library项目中使用了data binding,app项目必须也得在build.gradle中声明以上配置。

《穿越计算机的迷雾》读书笔记

穿越计算机的迷雾

李忠

1.4 电流是怎样形成的
2017-04-06
电压的存在是导致电流产生的原因
2017-04-06
通常,衡量一个电源的重要指标是它的电压,也就是它产生电的能力。不同的电源,所提供的电压也不相同。

2.3 二进制数就是比特串
2017-04-10
对于单个的二进制数位,它们都只有一个称呼“比特”,每个比特具有两个可能的值:0或者1。

《图解HTTP》读书笔记

图解HTTP

上野宣、于均良

1.3 网络基础 TCP/IP
2016-11-16
通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作的。而 HTTP 属于它内部的一个子集。
2016-11-16
TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。
2016-11-16
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
这种把数据信息包装起来的做法称为封装(encapsulate)。

1.4 与 HTTP 关系密切的协议 : IP、TCP 和 DNS
2016-11-17
IP 协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC 地址(Media Access Control Address)。
2016-11-17
为了准确无误地将数据送达目标处,TCP 协议采用了三次握手(three-way handshaking)策略

Android项目依赖配置说明(compile, apk or provided)

节选自https://developer.android.google.cn/studio/build/dependencies.html#library_dependency_configurations

Library dependency configurations

Inside the dependencies block, you can declare a library dependency using one of several different dependency configurations (such as compileshown above). Each dependency configuration provides Gradle different instructions about how to use the library. The following list describes each of the configurations you can use for a library dependency in your Android project.

Note: Although the Java Plugin for Gradle offers dependency configurations that are similar to those defined below, you cannot use them in your Android projects—only the following configurations are compatible with the Android plugin for Gradle.

compile(编译时依赖、打包到apk)
Gradle adds the dependency to the compilation classpath and to the APK.

apk(编译时不依赖、打包到apk)
Gradle adds the dependency to the APK only (it is not added to the compilation classpath).

provided(编译时依赖、不打包到apk)
Gradle adds the dependency to the compilation classpath only (it is not added to the APK). This is useful when you’re creating an Android library module and you need the dependency during compilation, but it’s optional to have present at runtime. That is, if you use this configuration, then your library module must include a runtime condition to check whether the dependency is available, and then gracefully change its behavior so it can still function if it’s not provided. This helps reduce the size of the final APK by not adding transient dependencies that aren’t critical.
You might also use this in an Android app module when your dependency is a JAR file that you need at compile-time and that you can safely assume is already available at runtime (and therefore you don’t want to copy it into your APK). Or perhaps you want to compile against the JAR specified with the provided configuration, but use the apk configuration to package a different JAR into the APK, which includes the same APIs you need at runtime.

Note: If you’re creating an Android app module, you cannot use provided for AAR dependencies, only for JARs. In an Android library module, you can use it for both JARs and AARs.