ホームページ  >  記事  >  データベース  >  レタスを使用して Redis を起動することによって発生するメモリ リーク エラーを解決する方法

レタスを使用して Redis を起動することによって発生するメモリ リーク エラーを解決する方法

王林
王林転載
2023-05-29 09:01:172257ブラウズ

Redis はレタスを使用します。

LEAK: hashedwheelTimer.release() はガベージ コレクトされる前に呼び出されませんでした。高度なリークを有効にする

メモリ リーク。実際には、メモリ不足が原因です。

eclispe でウィンドウ -> 設定 -> Java -> インストールされた JRE を見つけて、右側の [編集] ボタンをクリックし、[デフォルトの VM 引数] オプションに次の値を入力します。編集インターフェイス。

-Xms64m -Xmx128m

メモリを十分な大きさに調整すれば解決できます。

他の方法では解決できません。メソッドの設定が間違っているかどうかはわかりません

#1. Eclipse 構成ファイル eclipse.ini を開き、-Xmx を変更します (値は、jvm が使用できる最大メモリ量を表します)

2. 実行 Java プログラムを使用する場合は、「実行」->「実行構成」->「引数」を選択し、「-Xms100M -Xmx800M」と入力します (-Xms は、jvm の開始時に割り当てられるメモリ サイズを表し、-Xmx は、実行できる最大メモリ量を表します)割り当てられます)。

補足: Redis 接続プールのレタスの落とし穴記録

1. はじめに

最近、私たちはさまざまなテスト環境にプロジェクトを頻繁にデプロイしています。 Redis の問題は、構築およびデプロイのプロセス中に発生しました。プロジェクトは SpringBoot2.1.12 に基づいており、SpringBoot2.1.X 統合 jar パッケージ Spring-data-redis-start は Redis 接続プールとして Lettuce を使用します。

SpringBoot1.x は、デフォルトで Jedis を Redis クライアント接続プールとして使用します。

SpringBoot2.x、spring-data-redis は、デフォルトで Redis クライアント ドライバー接続プールとして Lettuce を使用します。

2. 落とし穴シナリオ

実行環境の Redis クラスターの特定のマスター ノードが不安定で接続できないため、SpringBoot アプリケーションが Redis への接続時にエラーと接続タイムアウト エラーを報告します。 。

3. 解決策

Spring-data-redis に基づいて RedisConnectionFactory Bean を書き換えます。 「クラスター ノード メンバーシップの検証をキャンセル」: .validateClusterNodeMembership(false) を設定する必要があります。

1. redis 構成

spring:
 redis:
   cluster:
     nodes:
     - ${redis.host.cluster} #redis集群ip-port
   password: ${redis.password}
   timeout: 5000 #连接超时时间
   lettuce:
     pool:
       max-active: 10 #连接池最大连接数
       max-wait: -1 #连接池最大阻塞时间
       max-idle: 5 #连接池中最大空闲连接
       min-idle: 1 #连接池中最小空闲连接
redis:
 cluster:
   enabled: true

2. 構成構成クラス

@Data
@Component
@ConditionalOnProperty(name = "redis.cluster.enabled", havingValue = "true", matchIfMissing = false)
public class RedisConfig {
    @Autowired
    RedisProperties redisProperties;
    // 在构建LettuceConnectionFactory时,如果不使用内置的destroyMethod,可能会导致Redis连接早于其它Bean被销毁
    @Bean(destroyMethod = "destroy")
    public RedisConnectionFactory newLettuceConnectionFactory() {
        // 配置用于开启自适应刷新和定时刷新。如自适应刷新不开启,Redis集群变更时将会导致连接异常
        ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
                .enablePeriodicRefresh(Duration.ofSeconds(60))// 开启周期刷新(默认60秒)
                .enableAdaptiveRefreshTriggers(RefreshTrigger.ASK_REDIRECT,RefreshTrigger.UNKNOWN_NODE)// 开启自适应刷新
                .build();
        ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
                                 .topologyRefreshOptions(clusterTopologyRefreshOptions)//拓扑刷新
                                 .disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
                                 .autoReconnect(true)
                                 .socketOptions(SocketOptions.builder().keepAlive(true).build())
                       .validateClusterNodeMembership(false)// 取消校验集群节点的成员关系
                                 .build();
        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .clientOptions(clusterClientOptions)
                                .readFrom(ReadFrom.SLAVE_PREFERRED)
                                .build();
        return new LettuceConnectionFactory(getClusterConfiguration(), clientConfig);
    }
    
    private  RedisClusterConfiguration getClusterConfiguration() {
        RedisProperties.Cluster clusterProperties = redisProperties.getCluster();
        RedisClusterConfiguration config = new RedisClusterConfiguration(clusterProperties.getNodes());
        if (clusterProperties.getMaxRedirects() != null) {
            config.setMaxRedirects(clusterProperties.getMaxRedirects());
        }
        if (redisProperties.getPassword() != null) {
            config.setPassword(RedisPassword.of(redisProperties.getPassword()));
        }
        return config;
    }
}

注:

RedisClusterConfiguration getClusterConfiguration() にはパスワードの設定が必要ですそれ以外の場合は、SpringBoot が開始され、認証エラーが報告されます:

"io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required"

は次のとおりです:

また、lettuce - コア jar パッケージのバージョンが低すぎて、一部の構成項目がサポートされないようにすることはできません。上記の構成は lettuce-core-5.18.RELEASE.jar です。

以上がレタスを使用して Redis を起動することによって発生するメモリ リーク エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。