0%

Java NIO (New IO) 是一个可以替代标准 Java IO API 的 IO API(从 Java 1.4 开始),Java NIO 提供了与标准 IO 不同的 IO 工作方式。

  • Java NIO: Channels and Buffers(通道和缓冲区):标准的 IO 基于字节流和字符流进行操作的,而 NIO 是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
  • Java NIO: Non-blocking IO(非阻塞 IO):Java NIO 可以让你非阻塞的使用 IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
  • Java NIO: Selectors(选择器):Java NIO 引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。
阅读全文 »

Copy-On-Write 简称 COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容 Copy 出去形成一个新的内容然后再改,这是一种延时懒惰策略。从 JDK1.5 开始 Java 并发包里提供了两个使用 CopyOnWrite 机制实现的并发容器,它们是 CopyOnWriteArrayList 和 CopyOnWriteArraySet。CopyOnWrite 容器非常有用,可以在非常多的并发场景中使用到。

阅读全文 »

引言

在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环 CAS 的方式来实现,本文让我们一起来研究下 Doug Lea 是如何使用非阻塞的方式来实现线程安全队列 ConcurrentLinkedQueue 的,相信从大师身上我们能学到不少并发编程的技巧。

阅读全文 »

术语定义

术语:哈希算法
英文: hash algorithm
解释:是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 

阅读全文 »

哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如 memcached)的核心其实就是在内存中维护一张大的哈希表,而 HashMap 的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对 java 集合框架中的对应实现 HashMap 的实现原理进行讲解,然后会对 JDK7 的 HashMap 源码进行分析。

阅读全文 »

Java 虚拟机类加载过程中的 “加载” 阶段第一步就是 “通过一个类的全限定名来获取描述此类的二级制字节流”,这个动作由 Java 虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的模块叫做 “类加载器”。

阅读全文 »

类加载的时机

类从被加载到虚拟机开始,到卸载为止,生命周期如图所示:

其中,加载、验证、准备、初始化、卸载这五个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班的开始(开始不代表完成,通常为交叉混合运行),而解析阶段不一定:它在某些情况下可以在初始化阶段之后再开始。

阅读全文 »

判断对象是否可回收的常见方法

引用计数算法(Reference Counting)

给对象中添加一个引用计数器,每当有一个地方引用时,计数器加 1;当引用失效时,计数器减 1;任何时刻计数器为 0 的对象就是不可能再被使用的。

  • 优点:实现简单,判定效率高;
  • 缺点:很难解决对象之间的循环引用问题;

JVM 并不使用这种算法。

阅读全文 »

-verbose

java -verbose [:class|gc|jni] 在输出设备上显示虚拟机运行信息。

  • -verbose:class:监视输出运行期间的类加载情况
  • -verbose:gc:监视输出运行期间的内存回收 GC 情况
  • -verbose:jni:监视输出 native 方法调用的相关情况,一般用于诊断 jni 调用错误信息。
阅读全文 »

Java 虚拟机内存规范所管理的内存包括如下运行时数据区域:程序计数器、虚拟机栈、本地方法栈、Java 堆、方法区等。

阅读全文 »