Git安装
- 在Linux上安装
Debian / Ubuntu
1
$ sudo apt-get install git
CentOS
1
$ sudo yum install git
Do one thing, do it well.
接下来会写技术内容包括
git
dubbo
redis
kafka
netty
java8
jvm
边看边记录,写代码,视频无法检索,视频最多看三遍。
Java8
Netty
JVM
Node
Spring
阅读原文
Reading compiled Java bytecode can be tedious, even for experienced Java developers.
即使对于经验丰富的Java开发人员来说,阅读编译后的Java字节码也可能很乏味。
Why do we need to know about such low-level stuff in the first place?
首先,我们为什么需要知道这些底层的东西呢?
Here is a simple scenario that happened to me last week:
下面是上周发生在我身上的一个简单场景:
I had made some code changes on my machine a long time ago, compiled a JAR,
很久以前,我在自己的机器上修改了一些代码,编译成一个JAR包,
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被直接使用的Java类型。
在Java语言中,类型
(class)的加载、连接与初始化过程都是在程序运行期间
完成的,通过这种方式提供了更大的灵活性,
增加了更多的可能性。Java里天生支持的动态扩展
的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。
例如,如果编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类。
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下几个阶段:
静态变量
(类变量)分配内存,并将其初始化为默认值
,但在到达初始化之前,类变量都没有初始化为真正的初始值;加载、验证、准备、初始化和卸载5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始
(注意,这里写的是开始,而不是进行或完成,因为这些阶段通常都是互相交叉地混合式进行的,通常会在一个阶段执行的过程中调用、激活另一个阶段)。
而解析阶段则不一定,它在某些情况下可以在初始化之后再开始。
对于类加载过程的第一个阶段(加载)什么时候开始,Java虚拟机规范中并没有进行强制约束,由虚拟机的实现自由把握。但是对于初始化阶段
,
虚拟机规范严格规定了有且只有5种情况必须立即对类进行初始化(而加载、验证、准备自然需要在此之前开始):
以上5种情况对应的行为称为对一个类的主动使用
。除此之外,所有引用类的方式都不会触发初始化,被称为被动使用
。