response.setHeader(Content-Type)与response.setContentType()的区别

0 条评论

在Java Web编程中,设置Content-TypeContent-Length头部是再经常不过的操作了,但是HttpServletResponse提供了两个相关的方法来设置头部,一个是void setHeader(String name, String value),一个是void setContentType(String type)或者void setContentLength(int len)。这两者之间有什么区别吗?之前一直分不清楚,也在代码中看到两种方式都有被人使用,甚至是两个一起写的。

阅读全文

JDK源码阅读-DirectByteBuffer

0 条评论

在文章JDK源码阅读-ByteBuffer中,我们学习了ByteBuffer的设计。但是他是一个抽象类,真正的实现分为两类:HeapByteBufferDirectByteBufferHeapByteBuffer是堆内ByteBuffer,使用byte[]存储数据,是对数组的封装,比较简单。DirectByteBuffer是堆外ByteBuffer,直接使用堆外内存空间存储数据,是NIO高性能的核心设计之一。本文来分析一下DirectByteBuffer的实现。

阅读全文

JDK源码阅读-Reference

0 条评论

Java最初只有普通的强引用,只有对象存在引用,则对象就不会被回收,即使内存不足,也是如此,JVM会爆出OOME,也不会去回收存在引用的对象。

如果只提供强引用,我们就很难写出“这个对象不是很重要,如果内存不足GC回收掉也是可以的”这种语义的代码。Java在1.2版本中完善了引用体系,提供了4中引用类型:强引用,软引用,弱引用,虚引用。使用这些引用类型,我们不但可以控制垃圾回收器对对象的回收策略,同时还能在对象被回收后得到通知,进行相应的后续操作。

阅读全文

Hexo博客搭建与发布最强套路

0 条评论

最近升级了博客的搭建与发布工作流,在此总结一下。

阅读全文

JDK源码阅读-ByteBuffer

0 条评论

Buffer是Java NIO中对于缓冲区的封装。在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接。但是在Java NIO中,缓冲区这一概念变得复杂,可能是对应Java堆中的一块内存,也可能是对应本地内存中的一块内存。而byte数组只能用来指定Java堆中的一块内存,所以Java NIO中设计了一个新的缓冲区抽象,涵盖了不同类型缓冲区,这个抽象就是Buffer。

阅读全文

JDK源码阅读-InterruptibleChannel与可中断IO

0 条评论

Java传统IO是不支持中断的,所以如果代码在read/write等操作阻塞的话,是无法被中断的。这就无法和Thead的interrupt模型配合使用了。JavaNIO众多的升级点中就包含了IO操作对中断的支持。InterruptiableChannel表示支持中断的Channel。我们常用的FileChannel,SocketChannel,DatagramChannel都实现了这个接口。

阅读全文

Java日志-Log4j实现运行时修改日志级别

0 条评论

源码分析后,实现Log4j运行时修改日志级别思路就非常清晰了。

阅读全文

Java日志-Log4j源码分析

0 条评论

Log4j是一个历史非常悠久的库首次发布与2001年1月,有17年历史了,那个时候Java才发布1.3版本,所以也可以从Log4j的代码中看到他使用了很多古老的JDK类,比如Hashtable,可能是因为兼容性的考虑,后续的版本也一直没有升级这些地方。虽然Log4j历史悠久,但是应该还是使用最广泛的日志实现,我们分析其实现,还是能学到很多东西的,对于后续分析Log4j2或者Logback,都是有帮助的。

阅读全文

Java日志-SLF4J使用与源码分析

0 条评论

SLF4J全称The Simple Logging Facade for Java,Java简易日志门面,将接口抽象与实现隔离开,在不修改代码的情况下使用不同的日志实现。

阅读全文

自己动手写操作系统-计算机通电之后的操作

0 条评论

以前每次开机,先是看到一个黑屏幕上显示一些字符,然后会进入windows经典的启动界面。对于要编写操作系统来说,这种表面的认识是不够的,得需要知道一下通电后,执行的入口是哪里,启动的流程是如何跑起来的。

阅读全文