SSLEngine阻塞IO

时间:2016-10-05 06:05:32

标签: java ssl nio

从SSLEngine文档:"通过将SSL / TLS抽象与I / O传输机制分离,SSLEngine可用于各种I / O类型,例如非阻塞I / O (轮询),可选的非阻塞I / O,Socket和传统的Input / OutputStreams,本地ByteBuffers或字节数组,..."与使用SSLSocket阻止IO相比,将SSLEngine与常规套接字和阻塞通道一起使用会更好。

1 个答案:

答案 0 :(得分:0)

边缘,是的。 NIO不仅仅是关于非阻塞IO。它还带来了:

  • 更高的杠杆API,基于包装的缓冲区(ByteBuffers),而不仅仅是字节数组。
  • “散射”和“收集”API,即在同一IO操作中使用多个顺序缓冲区的能力。
  • 直接IO:使用“直接”ByteBuffers,它可以存活在堆外。

最后一点具有非常具体的一般性能影响,因为当使用基于堆的数组/缓冲区时,JVM会对本机调用中发送的任何数组执行额外的副本,以促进与垃圾收集器的同步。使用本机缓冲区可以避免这种情况,这可以显着减少垃圾收集开销。

也就是说,SSLEngine存在巨大的可用性问题,因为正确地使用它会严重认真,特别是比使用旧的SSLSocket要困难得多。

幸运的是,this library允许使用带有ByteChannel接口的SSLEngine,围绕SSLEngine进行所有繁重的工作(免责声明:我是主要作者)。