JVM源码分析-类加载场景实例分析

A类调用B类的静态方法,除了加载B类,但是B类的一个未被调用的方法间接使用到的C类却也被加载了,这个有意思的场景来自一个提问:方法中使用的类型为何在未调用时尝试加载?

阅读全文

JVM源码分析-JVM源码编译与调试

要分析JVM的源码,结合资料直接阅读是一种方式,但是遇到一些想不通的场景,必须要结合调试,查看执行路径以及参数具体的值,才能搞得明白。所以我们先来把JVM的源码进行编译,并能够使用GDB进行调试。

阅读全文

URI中+号的坑

URI中+号表示空格,这一点已经是常识般的存在。但是还是存在很多令人困扰的地方,并带来许多BUG。

首先是一些Java类,甚至是JDK自带的URI类令人迷惑的表现:

1
2
3
4
5
6
7
URI uri = new URI(null, null, "1%+ 2", "a=%+ b", null);
System.out.println(uri); // 1%25+%202?a=%25+%20b

URIBuilder uriBuilder = new URIBuilder();
uriBuilder.setPath("1%+ 2");
uriBuilder.addParameter("a","%+ b");
System.out.println(uriBuilder); // 1%25+%202?a=%25%2B+b

阅读全文

记一次下载大文件存在数据异常问题排查

最近遇到了一个很诡异的问题,有用户反馈从文件下载服务测试环境下载一个视频文件,每次MD5都不一样。。。

对于文件下载服务来说,下载文件内容错乱是个很严重的问题了,但是之前一直也没遇到过文件内容错乱的问题。看了一下问题文件,是一个视频文件,大小为1.08GB。第一个反应就是可能是一个大文件下载才会触发的问题。接着问用户如何发现这个问题的,答曰因为这个视频文件播放到最后很卡,第二个反应是下载到最后存在数据错乱。

阅读全文

记一次NoHttpResponseException问题排查

上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws.com:80 failed to respond,看着是上传到S3的过程中发送了网络错误?

阅读全文

Content-Disposition头部中文编码测试

Content-Disposition头部有两个用途:第一是在响应的Header中,用于表示响应的内容是如何展示的,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。第二个用途是在multipart/form-data类型的请求报文中,用于表示每个字段的的名称等信息。

阅读全文

AWS S3 HTTPS域名请求提示SSLPeerUnverifiedException

Java中使用HttpClient4.4进行S3上传下载操作,使用的域名是s3-us-west-1.amazonaws.com。在HTTP协议下是正常工作的,但是如果切换到HTTPS,会提示错误:

1
javax.net.ssl.SSLPeerUnverifiedException: Host name 's3-us-west-1.amazonaws.com' does not match the certificate subject provided by the peer (CN=*.s3-us-west-1.amazonaws.com, O=Amazon.com Inc., L=Seattle, ST=Washington, C=US)

阅读全文

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

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

阅读全文

JDK源码阅读-DirectByteBuffer

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

阅读全文

JDK源码阅读-Reference

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

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

阅读全文