Netty:SslProvider.OPENSSL_REFCNT 示例

问题描述 投票:0回答:1

我正在将

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
,它没有终结器,而是实现了 ReferenceCounted。

  • 我想知道它是否可以直接替代
    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()));
}
...
}

openssl netty tcnative
1个回答
0
投票

请注意,Netty API Reference 说:

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

所以它不是一个替代品,因为你必须替换通常会处理这个问题的终结器。参见例如这个Github问题作为考虑可能的实际后果的示例。

© www.soinside.com 2019 - 2024. All rights reserved.