JVM(五)虚拟机类加载机制

Java 提供了动态的装载特性;它会在运行时的第一次引用到一个 class 的时候对它进行装载和链接,而不是在编译期进行。JVM 的类装载器负责动态装载,基本上所有的类加载器都是 java.lang.ClassLoader 类的一个实例。 Java 类装载器有如下几个特点: 层级结构:Java 里的类装载器被组织成了有父子关系的层级结构。Bootstrap 类装载器是所有装载器的父亲。 代理模式:基于层级结构,类的装载可以在装载器之间进行代理。当装载器装载一个类时,首先会检查它是否在父装载器中进行装载了。如果上层的装载器已经装载了这个类,这个类会被直接使用。反之,类装载器会请求装载这个类。 ...

JVM(六)虚拟机类加载委派模型

双亲委派模型当一个类装载器(class loader)被请求装载类时,它首先按照顺序在上层装载器、父装载器以及自身的装载器的缓存里检查这个类是否已经存在。简单来说,就是在缓存里查看这个类是否已经被自己装载过了,如果没有的话,继续查找父类的缓存,直到在 bootstrap 类装载器里也没有找到的话,它就会自己在文件系统里去查找并且加载这个类。ClassLoader 的 loadClass 方法 protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundExcep ...

JVM(四)类文件结构解析

Java Class 文件结构如下图所示对于以下 java 源文件代码 public class Charles implements ICharles{ private String name; public void say() { System.out.println("charles"); } public String getName() { return name; } public void setName(String name) { this.nam ...

JVM(三)内存分配与回收策略

对象的分配的细节取决于当前使用哪一种垃圾收集器组合,以及和内存相关参数有关,本文主要讨论 Serial/SerialOld 收集器的内存分配和回收的策略,其他几种垃圾收集器可以自己去探讨。先介绍下 MinorGC 和 FullGC 的概念。新生代 GC(MinorGC): 发生在新生代,Java 对象大多都有朝生夕死的特性,MinorGC 非常频繁,回收速度也比较快。老年代 GC(MajorGC/FullGC): 发生在老年代,出现 MajorGC 经常至少伴随一次的 MinorGC,但非绝对。MajorGC 的速度一般比 MinorGC 慢 10 倍以上。下面是最普遍的内 ...

JVM(二)垃圾收集算法与收集器

Java 堆中几乎存放着 java 中所有的对象实例,垃圾收集器在对堆进行回收前,需要确定哪些对象还”存活”着,哪些已经“死去”。垃圾回收必须能够完成两件事情:正确检测出垃圾对象;释放垃圾对象占用的空间。 1、垃圾检测算法当前常见的检测垃圾的方法包括两种:1. 引用计数法;2. 可达性分析算法。 1.1 引用计数算法(Reference Counting)给对象添加一个引用计数器,每当该对象被引用,它的计数器值就+ 1;当引用失效时,计数器就-1;在任何情况下,当计数器值为 0 时,就表示该对象不再被使用。缺点:它很难解决对象之间相互引用,引起的循环引用问题,会产生无法被释放的内存区域。因此, ...

JVM(一)Java内存区域与内存溢出

Java 内存区域Java 虚拟机所管理的内存将包括以下几个运行时数据区域,如下图所示: 程序计数器ProgramCounterRegister 是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变程序计数器的值来选取下一条要执行的字节码指令,分支、循环、跳转、异常跳转、线程恢复等基础功能都需要依赖这个计数器来完成。由于 Java 虚拟机的多线程时通过线程切换并分配处理器执行时间来实现的,对于单核处理器在某一个时间都只会有一个线程在运行,为了线程切换后能恢复到正确的执行位置,每个线程都需要维护一个独立的程序计数器,各个线程之间的计数器互不影 ...

JDK设计模式(十七)命令模式

1、概述命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。 2、解决的问题用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。 3、模式中的角色1、命令(Command)角色:定义命令的接口,声明执行的方法。2、具体命令(ConcreteCommand)角色:命令接口实现对象,通常它会持有命令的接收者,通过调用接收者相应的功能方法来执行当前命令所要完成的操作。3、接收者(Receiver)角色:真正执行命令的对象。任何类都可以成为一个接收者,只要它能够实现命令要求实现的相应功能即可。4、请求者(Invoker) ...

JDK设计模式(十六)责任链模式

1、概述责任链模式避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 2、解决的问题如果有多个对象都有可能接受请求,可以避免请求发送者与接收者耦合在一起。 3、模式中的角色1、抽象处理者角色(Handler): 定义一个处理请求的接口,和一个后继连接(可选)2、具体处理者角色(ConcreteHandler): 处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者。3、客户类(Client): 向一个链上的具体处理者 ConcreteHandler 对象提交请求。 4、模式解读责 ...