JDK解构 – Java中的引用和动态代理的实现

我们知道,动态代理(这里指JDK的动态代理)与静态代理的区别在于,其真实的代理类是动态生成的。但具体是怎么生成,生成的代理类包含了哪些内容,以什么形式存在,它为什么一定要以接口为基础?

如果去看动态代理的源代码(java.lang.reflect.Proxy),会发现其原理很简单(真正二进制类文件的生成是在本地方法中完成,源代码中没有),但其中用到了一个缓冲类java.lang.reflect.WeakCache<ClassLoader, Class<?>[], Class<?>>,这个类用到了弱引用来构建。

在JDK的3个特殊引用中,弱引用是使用范围最广的,它的特性也最清晰,相对而言,其他两种逻辑稍显晦涩,源码中的注释也语焉不详。本文将简单介绍几种引用的行为特征,然后分析一下弱引用的一些实际应用场景,其中包含了动态代理中的实现。本文将包含以下内容:

  1. JDK中的引用类型
  2. 不同引用类型对GC行为的影响
  3. 引用类型的实现
  4. ThreadLocal对弱引用的使用
  5. 动态代理对弱引用的实现
  6. 虚引用如何导致内存泄漏

KK笔记:kknotes.com
本文链接地址: JDK解构 – Java中的引用和动态代理的实现

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

程序员拿什么来学英语

以前有个意大利的朋友,他怀着环游世界的梦想来到中国,在上海靠教小朋友英语挣点旅游经费,因缘际会一起去香港玩,在香港的太平山顶的山道上散步,天南海北地聊天。现在想想当时的画面应该很奇怪,一个带着南欧口音的意大利人和一个中式口音的中国人在用英语谈着人生和理想。偶然间聊到了中国的英语教育,于是有了如下的对话:

「中国人一般从什么时候开始学英语?」
「我是从初中开始学,但现在的小孩子最晚要从小学三年级就开始学了。像你们学校里应该有很多还没上小学的小朋友吧。」
「所有人吗?」,他表示很惊讶。
「是的。」
「你们为什么对英语这么执迷,那不是所有人大学毕业时都学了十多年了吗,但我见到的情况好像不太像啊?」
「大部分像我这样的学英语只是为了应付考试。」
「哦,对,你们好像要考CET才可以毕业,看来你们是用的太少了。」

KK笔记:kknotes.com
本文链接地址: 程序员拿什么来学英语

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

Java线程池的理论与实践

Doug Lea

前段时间公司里有个项目需要进行重构,目标是提高吞吐量和可用性,在这个过程中对原有的线程模型和处理逻辑进行了修改,发现有很多基础的多线程的知识已经模糊不清,如底层线程的运行情况、现有的线程池的策略和逻辑、池中线程的健康状况的监控等,这次重新回顾了一下,其中涉及大量java.util.concurrent包中的类。本文将会包含以下内容:

  1. Java中的Thread与操作系统中的线程的关系
  2. 线程切换的各种开销
  3. ThreadGroup存在的意义
  4. 使用线程池减少线程开销
  5. Executor的概念
  6. ThreadPoolExecutor中的一些具体实现
  7. 如何监控线程的健康

KK笔记:kknotes.com
本文链接地址: Java线程池的理论与实践

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

从I/O模型到Netty(三)

Netty

零、写在前面

本文虽然是讲Netty,但实际更关注的是Netty中的NIO的实现,所以对于Netty中的OIO(Old I/O)并没有做过多的描述,或者说根本只字未提,所以本文中所述的所有实现细节都是基于NIO版本的。

Netty作为一个已经发展了十多年的框架,已然非常成熟了,其中有大量的细节是普通使用者不知道或者不关心的,所以本文难免有遗漏或者纰漏的地方,如果你发现了请告知。

本文不涉及Netty5的部分。

虽然这一节叫「写在前面」,但实际上上最后写的。

KK笔记:kknotes.com
本文链接地址: 从I/O模型到Netty(三)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

从I/O模型到Netty(二)

旧瓶装新酒,Java NIO

在上一篇文章中对于I/O模型已经讲的比较清楚了,在I/O密集型应用中使用Reactor模式可以明显提高系统的性能(我们这里谈到的性能很大程度上指的是吞吐量),但是在具体的开发过程中模式还是要落地成真实的代码,使用传统的I/O库肯定是不行的,在Java中需要使用java.nio包下的库。

虽然是讲NIO的实现,但本文将不会把所有Java NIO中的主要API全部过一遍,而是通过例子理清NIO到底可以做什么事情。

本文中提到的JDK源代码都可以在%JAVA_HOME%/jre/lib/rt.jar中看到。

KK笔记:kknotes.com
本文链接地址: 从I/O模型到Netty(二)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

从I/O模型到Netty(一)

如何使用咖啡读文件
I/O是任何一个程序设计者都无法忽略的存在,很多高级编程语言都在尝试使用巧妙的设计屏蔽I/O的实际存在,减小它对程序的影响,但是要真正的理解并更好运用这些语言,还是要搞清楚I/O的一些基本理念。本文将从最基本的I/O概念开始,试图理清当前I/O处理存在的问题和与之对应一些手段及背后的思想。

本来这是上个月在公司内部做的一次关于NIO的分享,发现很多概念可能当时理解的很清楚,过了一段时间就会感到模糊了。在这里整理一下,以备以后查看,同时也将作为另一个系列的开端。

由于篇幅限制,本文将只包含I/O模型到Reactor的部分,下一篇会继续讲到Netty和Dubbo中的I/O。本文包含以下内容:

  1. 五种典型的I/O模型
  2. 同步&异步、阻塞&非阻塞的概念
  3. Reactor & Proactor
  4. Reactor的启发

KK笔记:kknotes.com
本文链接地址: 从I/O模型到Netty(一)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

一个外行如何快速融入node项目

nodejs

去年上半年开始接触了一些JS的后端编程,参与了一个基于node(其实是Meteor)的开源项目,有一些知识上的积累,现在回归了Java老本行,怕再过段时间就忘了,在这里记录一下,好记性不如烂笔头,说不定以后会有用。node大神可以看来消遣,跟我一样是外行但是需要写一些node程序的可以看看经验。这篇文章里会包含以下内容:

  1. 背景
  2. 关于Wekan
  3. 关于Meteor
  4. 关于publication&subscription
  5. 关于Jade&Stylus
  6. 关于JS

KK笔记:kknotes.com
本文链接地址: 一个外行如何快速融入node项目

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

MyBatis在Spring环境下的事务管理

MyBatis & Spring

MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能。但是由于它本身也有一些缓存、事务管理等功能,所以实际使用中还是会碰到一些问题——另外,最近接触了JFinal,其思想和Hibernate类似,但要更简洁,和MyBatis的设计思想不同,但有一点相同:都是想通过简洁的设计最大限度地简化开发和提升性能——说到性能,前段时间碰到两个问题:

  1. 在一个上层方法(DAO方法的上层)内删除一条记录,然后再插入一条相同主键的记录时,会报主键冲突的错误。
  2. 某些项目中的DAO方法平均执行时间会是其他一些项目中的 2倍 。

第一个问题是偶尔会出现,在实验环境无论如何也重现不了,经过分析MyBatis的逻辑,估计是两个DAO分别拿到了两个不同的Connection,第二个语句比第一个更早的被提交,导致了主键冲突,有待进一步的分析和验证。对于第二个问题,本文将尝试通过分析源代码和实验找到它的root cause,主要涉及到以下内容:

  1. 问题描述与分析
  2. MyBatis在Spring环境下的载入过程
  3. MyBatis在Spring环境下事务的管理
  4. 实验验证

KK笔记:kknotes.com
本文链接地址: MyBatis在Spring环境下的事务管理

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

MyBatis完全使用指南

MyBatis

MyBatis作为一个轻量的SQL映射框架,确实很简单,但是知识点挺多,实际使用中还是会有时想不起来某个标签该怎么写,所以整理了这篇文章,以备查询。由于MyBatis如此简单,使得这一篇文章基本把实际使用中常碰到的事情都涵盖了,包括:

  1. MyBatis中的一些概念
  2. MyBatis包含的内容
  3. SQL映射
  4. 动态SQL

KK笔记:kknotes.com
本文链接地址: MyBatis完全使用指南

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

刨根问底HTTP和WebSocket协议(三)

上篇文章发出来后,有人留言说到HTTP新版的RFC的问题,WebSocket和Socket的区别。本文将先回答这两个问题,然后继续展开WebSocket。在这篇文章将看到:

  1. 关于新的HTTP规范
  2. WebSocket和Socket的区别
  3. WebSocket中数据帧的格式
  4. WebSocket的实现:socket.IO
  5. 使用socket.IO实现一个在线直播系统

KK笔记:kknotes.com
本文链接地址: 刨根问底HTTP和WebSocket协议(三)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading