代码之家  ›  专栏  ›  技术社区  ›  Nishant Kumar

Netty:SslProvider。OPENSSL_REFCNT示例

  •  0
  • Nishant Kumar  · 技术社区  · 2 年前

    我正在使用 netty-tcnative 具有 SslProvider.OPENSSL 供应商。我在GC日志分析器中看到一条关于的警告消息 finalizers 我怀疑这主要是因为它。

    [Warning] At one point 25872 objects were queued for finalization. 
    Using finalizers is not recommended as it can slow garbage collection and cause wasted space in the heap. 
    Consider reviewing your application for occurrences of the finalize() method.
    

    我看到Netty提供了另一种选择 SslProvider.OPENSSL_REFCNT 它不具有终结器,而是实现ReferenceCount。

    • 我想知道这是否是的替代品 SslProvider。OPENSSL 或者是否需要更多的更改。
    • 生产准备好了吗?我看到它被标记为 @UnstableApi 任何 已知的副作用或问题?
    • 它的性能比 SslProvider。OPENSSL 用于低延迟 高通量系统?
    SslProvider provider = SslProvider.isAlpnSupported(SslProvider.OPENSSL) ? SslProvider.OPENSSL : SslProvider.JDK;
    logger.info("SSL provider: {}", provider);
    sslCtx = SslContextBuilder.forServer(keyManagerFactory)
        .sslProvider(provider)
        .ciphers(cypherList)
        .applicationProtocolConfig(new ApplicationProtocolConfig(
            Protocol.ALPN,
            SelectorFailureBehavior.NO_ADVERTISE,
            SelectedListenerFailureBehavior.ACCEPT,
            ApplicationProtocolNames.HTTP_1_1
        ))
        .sessionCacheSize(SSL_SESSION_CACHE_SIZE) // 1800 -> 30 mins
        .sessionTimeout(SSL_SESSION_CACHE_TIMEOUT_SECOND) // 1024 * 100 -> 1000_00 sessions
        .build();
    
    
    // DefaultServerInitializer
    public void initChannel(SocketChannel ch) {
    ...
    if (sslContext != null) {
      pipeline.addLast(sslContext.newHandler(ch.alloc()));
    }
    ...
    }
    
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   Krokomot    2 年前

    请注意,上的Netty API参考 public final class SslContextBuilder 说:

    如果sslProvider(sslProvider)设置为sslProvider。OPENSSL_REFCNT,则调用方负责释放此对象,否则本机内存可能会泄漏。

    这与的描述相对应 public interface ReferenceCounted ,以句子开头:

    需要显式解除分配的引用计数对象。

    因此,这不是一个权宜之计,因为您必须更换终结器,否则它将负责解除分配。例如,请参见 Github issue 例如考虑可能的实际后果。