JAVA类的加载机制
把类的描述文件从class文件中加载到内存,并且完成数据的校验、转化解析和初始化,最终形成虚拟机可以直接使用的JAVA类型的过程叫类的加载。
一个类从加载到虚拟机内存中开始再到从内存中卸载为止,它一共会经历以下7个阶段:加载、验证、准备、解析、初始化、使用、卸载。其中『验证、准备、解析』三个部分统称为『连接』。
类加载时机《JAVA虚拟机规范》中并没有严格规定类的『加载』阶段何时开始(这点可以由虚拟机自己决定),但是严格规定了有且只有以下六种情况的时候,必须对类完成初始化(当然,加载、验证、准备需要在初始化前完成)。
遇到new、getstatic、putstatic或invokestatic这四条字节码指令时,如果发现类没有完成初始化,则需要首先触发其初始化阶段。下面几种情况会使用到上面四条字节码指令:
使用new关键字实例化对象的时候
读取或设置一个对象的静态字段的时候。(被final修饰的,已经在编译期被放入静态常量池的除外)
调用一个类的静态方法的时候
使用java.lang.reflect包的方法对类进行反射调用的时候,如果发现类没有进行初始化,则需要首先触发其初 ...
JVM垃圾回收
分代收集理论现在大多数的垃圾回收都是基于分代理论设计的,不同厂商对于内存的操作细节都不太一样,所以这里不讨论具体垃圾回收算法的细节,只是介绍垃圾回收算法的一些思想。
分代收集虽然是一套理论,但是却是符合大多数程序运行的经验法则,它建立在以下两个假说之上:
弱分代假说绝大多数对象都是朝生夕灭的
强分代假说熬过了多次垃圾回收的对象,一般更难以消亡。
垃圾回收分类分代收集理论将内存(JAVA堆)分为了若干个区域,这样垃圾回收的时候就可以针对不同的区域进行回收,依据回收区域的不同,JAVA垃圾回收可以分为:Minor GC(Young GC)、Major GC(Old GC)和Full GC三种。由于不同区域存储对象的生存和消亡特征的不同,他们所使用的垃圾回收算法也不同,按垃圾回收算法划分,又可以分为以下几类:标记-删除算法、标记-复制算法、标记-整理算法。
按算法划分
标记-删除算法标记-删除算法是最基础的收集算法,他主要分为两个步骤:标记哪些活着的对象然后删除不用的对象(也可以反着来)。标记-删除算法有两个很明显的缺点,一个是随着标记对象的增多,效率会越来越低,第二个就是删除对象之后, ...
Java内存模型
本文是在《深入理解JAVA虚拟机》第三版的基础上整理出来的,强烈建议大家都去看看!
运行时数据区JAVA虚拟机在运行JAVA程序的过程中会把内存分成若干个数据区,这些数据区有各自不同的用途以及创建和销毁时机,有的区域伴随着JAVA虚拟机的进程启动而一直存在,有的区域则依赖用户的线程启动(创建)和停止(销毁),依据《JAVA虚拟机规范》的规定,JAVA虚拟机所管理的内存包括以下几个运行时数据区。
程序计数器程序计数器是一块比较小的内存空间,它可以看做是每个线程执行字节码指令的行号指示器。字节码解释器工作的时候,就是通过改变这个指示器的行号来选取下一条字节码指令的。线程的分支、循环、跳转、异常处理、线程恢复等功能都是依赖这个计数器来完成的。
如果虚拟机正在执行一个JAVA方法,那么计数器记录的就是JAVA虚拟机字节码指令的地址;如果执行的是本地方法(native),那么这里记录的内容就为空(undefined)。需要说明的是,这里是唯一不会抛出OutOfMemoryError的地方。
虚拟机栈和程序计数器一样,虚拟机栈也是线程私有的,它的生命周期和线程有一样。虚拟机栈描述的是执行JAVA ...
Docker MySQL单机安装
操作系统:Ubuntu 16.04 x64
docker版本:18.09.7
docker-compose版本:1.8.0
说明:
本次实验,docker和docker-compose均使用apt安装。
确定当前用户已经加入到docker组如果没有,执行如下命令sudo gpasswd -a ${USER} docker,然后退出当前用户重新登录。
开始安装在服务器适当位置新建mysql文件夹
1mkdir -p ~/docker/mysql
进入该文件夹,创建数据存放目录、备份目录、配置目录,然后编写docker-compose.yml文件。
123cd ~/docker/mysqlmdkir db backup confvi docker-compose.yml
由于我在开发环境常用的MySQL配置基本一样,所以特地将conf中的配置文件打包保存起来了,如果需要可以点击下载。下载到~/docker/mysql目录下,直接覆盖刚刚新建的conf目录即可。
文件内容如下:
1234567891011121314151617181920212223versio ...
Docker RabbitMQ单机安装
服务器环境操作系统:Ubuntu 16.04 x64
docker版本:18.09.7
docker-compose版本:1.8.0
说明:
本次实验,docker和docker-compose均使用apt安装。
确定当前用户已经加入到docker组如果没有,执行如下命令sudo gpasswd -a ${USER} docker,然后退出当前用户重新登录。
开始安装在服务器适当位置新建portainer文件夹
1mkdir -p ~/docker/rabbitmq
进入该文件夹,然后编写docker-compose.yml文件。
12cd ~/docker/rabbitmqvi docker-compose.yml
文件内容如下:
12345678910111213141516171819202122services: rabbitmq: restart: always image: rabbitmq:management container_name: dev.rabbitmq hostname: dev.rabbitmq ...