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

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

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

Java提供了动态的装载特性;它会在运行时的第一次引用到一个class的时候对它进行装载和链接,而不是在编译期进行。JVM的类装载器负责动态装载,基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。Java类装载器有如下几个特点: 层级结构:Java里的类装载器被组织成了有父子关系的层级结构。Bootstrap类装载器是所有装载器的父亲。 代理模式:基于层级结构,类的 […]

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

 对象的分配的细节取决于当前使用哪一种垃圾收集器组合,以及和内存相关参数有关,本文主要讨论Serial/SerialOld收集器的内存分配和回收的策略,其他几种垃圾收集器可以自己去探讨。 先介绍下MinorGC和FullGC的概念。 新生代GC(MinorGC): 发生在新生代,Java对象大多都有朝生夕死的特性,MinorGC非常频繁,回收速度也比较快。 老年代GC(MajorGC/F […]

Java锁(五)CyclicBarrier分析

CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉Cyclic […]

OpenJDK8构建

1.环境介绍 OpenJDK代码: http://hg.openjdk.java.net/jdk8u/jdk8u 2.JDK安装 这里安装的是构建OpenJDK需要依赖的JDK, 一般是当前构建版本的上一个版本, 比如我们这里需要安装JDK7,已经安装的可以略过这一步。 sudo add-apt-repository ppa:webupd8team/java sudo apt-get update […]

Java并发(一)volatile使用和解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一 […]

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

Java堆中几乎存放着java中所有的对象实例,垃圾收集器在对堆进行回收前,需要确定哪些对象还”存活”着,哪些已经“死去”。垃圾回收必须能够完成两件事情:正确检测出垃圾对象;释放垃圾对象占用的空间。 1、垃圾检测算法 当前常见的检测垃圾的方法包括两种:1. 引用计数法;2. 可达性分析算法。 1.1 引用计数算法(Reference Counting) 给对象添加一个引用计数器,每当该对象被引用, […]

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

Java内存区域 Java虚拟机所管理的内存将包括以下几个运行时数据区域,如下图所示: 程序计数器: ProgramCounterRegister是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变程序计数器的值来选取下一条要执行的字节码指令,分支、循环、跳转、异常跳转、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程 […]

JDK动态代理和CGLib代理实现分析

1、JDK动态代理 JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。 其中 InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一 起。 而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。 Inv […]