类加载机制

== 和equals

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是
值,引用数据类型==比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相
等,则返回 true (即,认为这两个对象相等)。

标题类加载机制

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构

1、在什么时候才会启动类加载器?

其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

2、类加载的过程
在这里插入图片描述
其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。
1、加载

”加载“是”类加机制”的第一个过程,在加载阶段,虚拟机主要完成三件事:

(1)通过一个类的全限定名来获取其定义的二进制字节流

(2)将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构

(3)在堆中生成一个代表这个类的Class对象,作为方法区中这些数据的访问入口。

相对于类加载的其他阶段而言,加载阶段是可控性最强的阶段,因为程序员可以使用系统的类加载器加载,还可以使用自己的类加载器加载。我们在最后一部分会详细介绍这个类加载器。在这里我们只需要知道类加载器的作用就是上面虚拟机需要完成的三件事,仅此而已就好了。

2、验证

验证的主要作用就是确保被加载的类的正确性。也是连接阶段的第一步。说白了也就是我们加载好的.class文件不能对我们的虚拟机有危害,所以先检测验证一下。他主要是完成四个阶段的验证:

(1)文件格式的验证:验证.class文件字节流是否符合class文件的格式的规范,并且能够被当前版本的虚拟机处理。这里面主要对魔数、主版本号、常量池等等的校验(魔数、主版本号都是.class文件里面包含的数据信息、在这里可以不用理解)。

(2)元数据验证:主要是对字节码描述的信息进行语义分析,以保证其描述的信息符合java语言规范的要求,比如说验证这个类是不是有父类,类中的字段方法是不是和父类冲突等等。

(3)字节码验证:这是整个验证过程最复杂的阶段,主要是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。在元数据验证阶段对数据类型做出验证后,这个阶段主要对类的方法做出分析,保证类的方法在运行时不会做出威海虚拟机安全的事。

(4)符号引用验证:它是验证的最后一个阶段,发生在虚拟机将符号引用转化为直接引用的时候。主要是对类自身以外的信息进行校验。目的是确保解析动作能够完成。

对整个类加载机制而言,验证阶段是一个很重要但是非必需的阶段,如果我们的代码能够确保没有问题,那么我们就没有必要去验证,毕竟验证需要花费一定的的时间。当然我们可以使用-Xverfity:none来关闭大部分的验证。
3、准备

准备阶段主要为类变量分配内存并设置初始值。
为static变量分配内存以及设置默认值

4、解析
解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程

5. 初始化
为静态变量赋值
JVM初始化步骤

1、假如这个类还没有被加载和连接,则程序先加载并连接该类

2、假如该类的直接父类还没有被初始化,则先初始化其直接父类

3、假如类中有初始化语句,则系统依次执行这些初始化语句

类初始化时机:只有当对类的主动使用的时候才会导致类的初
类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:

创建类的实例,也就是new的方式
访问某个类或接口的静态变量,或者对该静态变量赋值
调用类的静态方法
反射(如 Class.forName(“com.shengsiyuan.Test”))
初始化某个类的子类,则其父类也会被初始化
Java虚拟机启动时被标明为启动类的类( JavaTest),直接使用 java.exe命令来运行某个主类

卸载:
代表该类的类对象Class不再被使用时候

双亲委派机制的工作流程:

  1. 当前ClassLoader首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。

每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。

  1. 当前classLoader的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到bootstrp ClassLoader.

  2. 当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。

总结:

“双亲委派”机制只是Java推荐的机制,并不是强制的机制。

我们可以继承java.lang.ClassLoader类,实现自己的类加载器。如果想保持双亲委派模型,就应该重写findClass(name)方法;如果想破坏双亲委派模型,可以重写loadClass(name)方法。

java对象创建的步骤
对象的创建大概分为以下几步:

1:检查类是否已经被加载;

2:为对象分配内存空间;

3:为对象字段设置零值;

4:设置对象头;

5:执行构造方法。

对象访问定位的方式
连接
这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销

如何判断一个类是无用的类?
该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。
加载该类的 ClassLoader 已经被回收。
该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

垃圾收集算法有哪些?以及它们各自的优缺点
引用计数法
可达性分析
分带回收
复制
标注清楚
Minor GC和FUll GC的区别
当jvm 无法为新建对象分配内存空间的时候Minor GC被触发,例如新生代空间被占满。因此新生代空间占用率越高,Minor GC越频繁。

Full GC (是全部的意思)
Full GC主要指新生代、老年代、metaspace上的全部GC。

设计模式:
Java8中的观察者模式

Http长连接、短链接
http1.0 使用短链接
http1.1 默认使用长连接
linux文件目录

在这里插入图片描述
4.2 一些常见的 Linux 命令了解吗?
目录切换命令
cd usr : 切换到该目录下usr目录
cd …(或cd…/) : 切换到上一层目录
cd / : 切换到系统根目录
cd ~ : 切换到用户主目录
cd - : 切换到上一个所在目录
目录的操作命令(增删改查)

  1. mkdir 目录名称 : 增加目录
  2. ls或者ll (ll是ls -l的缩写,ll命令以看到该目录下的所有目录和文件的详细信息):查看目录信息
  3. find 目录 参数 : 寻找目录(查)
  4. mv 目录名称 新目录名称 : 修改目录的名称(改)
    注意:mv的语法不仅可以对目录进行重命名而且也可以对各种文件,压缩包等进行 重命名的操作。mv命令用
    来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。后面会介绍到mv命令的另一个用法。
  5. mv 目录名称 目录的新位置 : 移动目录的位置—剪切(改)
    注意:mv语法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作。另外mv与cp的结果不
    同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。
  6. cp -r 目录名称 目录拷贝的目标位置 : 拷贝目录(改),-r代表递归拷贝
    注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不 用写-r递归
  7. rm [-rf] 目录 : 删除目录(删)
    注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了增强大家的记忆, 无论删除任何目录或文
    件,都直接使用 rm -rf 目录/文件/压缩包
    文件的操作命令(增删改查)
  8. touch 文件名称 : 文件的创建(增)
  9. cat/more/less/tail 文件名称 文件的查看(查)
    cat : 只能显示最后一屏内容
    more : 可以显示百分比,回车可以向下一行, 空格可以向下一页,q可以退出查看
    less : 可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看
    tail-10 : 查看文件的后10行,Ctrl+C结束
    注意:命令 tail -f 文件 可以对某个文件进行动态监控,例如tomcat的日志文件, 会随着程序的运行,日志会变
    化,可以使用tail -f catalina-2016-11-11.log 监控 文 件的变化
  10. vim 文件 : 修改文件的内容(改)
    vim编辑器是Linux中的强大组件,是vi编辑器的加强版,vim编辑器的命令和快捷方式有很多,但此处不一一阐
    述,大家也无需研究的很透彻,使用vim编辑修改文件的方式基本会使用就可以了。
    在实际开发中,使用vim编辑器主要作用就是修改配置文件,下面是一般步骤:
    vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输
    入:wq/q! (输入wq代表写入内容并退出,即保存;输入q!代表强制退出不保存。)
  11. rm -rf 文件 : 删除文件(删)
    同目录删除:熟记 rm -rf 文件 即可
    压缩文件的操作命令
    1)打包并压缩文件:
    Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。
    而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。 命令: tar -zcvf 打包压缩后的
    文件名 要打包压缩的文件 其中:
    z:调用gzip压缩命令进行压缩
    c:打包文件
    v:显示运行过程
    f:指定文件名
    比如:加入test目录下有三个文件分别是 :aaa.txt bbb.txt ccc.txt,如果我们要打包test目录并指定压缩后的压缩包名
    称为test.tar.gz可以使用命令: tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt 或: tar -zcvf
    test.tar.gz /test/
    2)解压压缩包:
    命令:tar [-xvf] 压缩文件
    其中:x:代表解压
    示例:
    1 将/test下的test.tar.gz解压到当前目录下可以使用命令: tar -xvf test.tar.gz
    2 将/test下的test.tar.gz解压到根目录/usr下: tar -xvf xxx.tar.gz -C /usr (- C代表指定解压的位置)
    其他常用命令
    pwd : 显示当前所在位置
    grep 要搜索的字符串 要搜索的文件 --color : 搜索命令,–color代表高亮显示
    ps -ef / ps aux : 这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同。如果想要查看
    特定的进程可以使用这样的格式: ps aux|grep redis (查看包括redis字符串的进程)
    注意:如果直接用ps((Process Status))命令,会显示所有进程的状态,通常结合grep命令查看某进程的
    状态。
    kill -9 进程的pid : 杀死进程(-9 表示强制终止。)
    先用ps查找进程,然后用kill杀掉
    网络通信命令:
    查看当前系统的网卡信息:ifconfig
    查看与某台机器的连接情况:ping
    查看当前系统的端口使用:netstat -an
    shutdown : shutdown -h now : 指定现在立即关机; shutdown +5 “System will shutdown after 5
    minutes” :指定5分钟后关机,同时送出警告信息给登入用户。
    reboot : reboot : 重开机。 reboot -w : 做个重开机的模拟(只有纪录并不会真的重开机)。

分布式锁
所谓 Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我们期望的顺
序不同,这样也就导致了结果的不同!
推荐一种方案:分布式锁(zookeeper 和 redis 都可以实现分布式锁)。(如果不存在 Redis 的并发竞争 Key 问
题,不要使用分布式锁,这样会影响性能)
基于zookeeper临时有序节点可以实现的分布式锁。大致思想为:每个客户端对某个方法加锁时,在zookeeper上的
与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。 判断是否获取锁的方式很简单,只需要判断有
序节点中序号最小的一个。 当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁
无法释放,而产生的死锁问题。完成业务流程后,删除对应的子节点释放锁。
在实践中,当然是从以可靠性为主。所以首推Zookeeper。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值