说道高并发设计,编写高并发的程序的基础是你要熟悉jvm的构造。清楚的知道线程安全是存在那个区域,发生线程安全问题的区域是那块,在该块中存在的是那些数据。

jvm的就是我们常说的java虚拟机,也是我们常说的java运行环境jre,从jre的创建到分配区域再到运行主要分为三个阶段,初始化,分配内存,执行,每个阶段做的事情不同。

一,初始化:这里我们最常听到的就是类加载器。该过程主要分为三个步骤:

    1,类加载器,类加载器主要有三个,bootstrap,extension,application。bootstrap加载器是最底层的加载器,主要是加载引导路径的类,在java中主要体现的是java本身的核心类;extension加载器负责加载java中ext目录中的jar类文件;application主要加载应用程序,环境变量中的类。

    2,加载后的处理,链接,主要是对加载的类进行验证,准备,解释。验证,就是要验证加载的类中字节码是否正确,如果不正确则会提示相应的错误信息。准备,对类中的一些变量,如静态变量,内存开始进行默认的分配内存。解释,将有符号的引用替换为方法区的原始引用。

    3,初始化,这是类加载阶段的最后操作,主要是对静态变量进行初始复制,并且静态区块将开始执行。

二,分配内存:主要涉及java运行时的主要内存区域,方法区,堆内存,栈内存,pc寄存区,本地方法区。

    1,方法区,所有的类级的数据都是存储在这的,包括静态变量,强调的一点,每个jvm只有一个方法区,并且,该区域中的内存是共享的,也就是说,该内存区域中的数据是存在数据安全的。平时我对静态变量的初始设置一般都是采用final的修改,保证该变量是不可变的。

    2,堆内存,是所有java程序员比较熟悉的名字,在java中对象和数组类的存储区域,每new一个对象或者创建一个数组都将在该区域中存储,同样强调一点,每个jvm中只有一个堆内存,所以该区域的内容也是共享的,同理,共享的内容是存在数据安全问题的。

    3,栈内存,对于每个线程的创建运行,都将创立自己的堆栈内容区域,局部变量及方法中的引用都是单独的栈内存,我们比较熟悉的讲法是压栈,弹栈,也就是后进先出的概念。该区域是隶属每个运行线程的,所以该区域是线程安全的。

    4,寄存器,寄存器相对简单,就是我们常说的cpu的指令切换,每个线程都有自己的执行指令,并且将自己的执行指令保存在该区域,cpu切换到该线程时,从上次执行指令继续执行,执行完进行cpu切换时会将新的执行指令更新到寄存器中。

    5,本地方法区,相对更为简单,主要存储的本地方法的地方,也就是我们平时很少接触到的,存储的是本地方法和底层语言c之间的调用。

三,执行,java虚拟机中的执行引擎按照字节码逐行的执行,说白点就是代码是怎样的运行。主要分为三个部分,解释器,jit编译器,垃圾回收器。

    1,解释器,解释器就是快速的解释字节码,使java编程机器可以识别的语言,但是该操作较为缓慢,并且执行每次方法都需要一个解释器,资源重复浪费。

    2,jit编辑器,解释器的运行需要jit编辑器的帮助,特别是有重复代码的地方,jit编辑器会介入,将重复的字节码编辑成本地代码,提供效率。

    3,垃圾回收器,在java开发过程中是听到最多的,也是最不常用的。垃圾回收器是按照一定的算法进行收集和删除为引用的对象,保证内存的重复使用,距离java操作最近的就是System.gc(),执行垃圾回收,该操作只是告诉jvm要执行垃圾回收,什么时候执行,怎么执行都是jvm自己定的。