2016-10-05 97 views
1

從SSLEngine文檔:「通過從I/O傳輸機制分離SSL/TLS抽象,SSLEngine可用於各種I/O類型,例如非阻塞I/O(輪詢),可選的非阻塞I/O,Socket和傳統的Input/OutputStreams,本地ByteBuffers或者字節數組......,「將SSLEngine用於常規套接字和阻塞通道,與使用SSLSocket阻塞IO相比更好。帶阻塞IO的SSLEngine

+0

不是。它是網絡綁定的。幾年前,我對此進行了廣泛的測試。 NIO有更好表現的信念通常是一個神話。它所具有的功能,或者至少它所設計的具有更好的可擴展性。不是一回事。 – EJP

回答

0

從頭開始,是的。 NIO不僅關於非阻塞IO。它還帶來了:

  • 基於包裝緩衝區(ByteBuffers)而不是字節數組的更高等級的API。
  • 「Scattering」和「gathering」API,即在相同IO操作中使用多個連續緩衝區的能力。
  • 直接IO:使用「直接」ByteBuffers,可以活在堆外面。

最後一點具有非常具體的一般性能影響,因爲使用基於堆的陣列/緩衝器時,JVM將不會在天然呼叫發送的任何陣列的額外副本,以促進與垃圾收集器的同步。本地緩衝區可以避免這種情況,這可以顯着減少垃圾收集開銷。

這就是說,SSLEngine具有巨大的可用性問題,因爲正確使用它是嚴重難,特別是比使用舊的SSLSocket更難。

幸運的是,this library允許使用帶有ByteChannel接口的SSLEngine,在SSLEngine周圍進行所有繁重的工作(免責聲明:我是主要作者)。