public static final long MONTH_IN_MILLIS = 30*24*60*60*1000

本文介绍了一个关于Java中整型变量溢出的实际案例。在计算两个时间点间大致月份数量时,由于常量定义不当导致计算结果出现负数。通过调整常量定义方式解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public static final long MONTH_IN_MILLIS = 30*24*60*60*1000; 一看就明白这个是定义一月大概的微妙数.

当我在计算两个月之间大概的月的个数时, 总是发现他返回一个负数, 奇怪, 后面调试发现 MONTH_IN_MILLIS = -1702967296. 呵呵, 原来overflow了.

public static final long MONTH_IN_MILLIS = (30l)*24*60*60*1000;改成这样就ok了.


public static final ChannelOption<ByteBufAllocator> ALLOCATOR = valueOf("ALLOCATOR"); public static final ChannelOption<RecvByteBufAllocator> RCVBUF_ALLOCATOR = valueOf("RCVBUF_ALLOCATOR"); public static final ChannelOption<MessageSizeEstimator> MESSAGE_SIZE_ESTIMATOR = valueOf("MESSAGE_SIZE_ESTIMATOR"); public static final ChannelOption<Integer> CONNECT_TIMEOUT_MILLIS = valueOf("CONNECT_TIMEOUT_MILLIS"); /** @deprecated */ @Deprecated public static final ChannelOption<Integer> MAX_MESSAGES_PER_READ = valueOf("MAX_MESSAGES_PER_READ"); public static final ChannelOption<Integer> MAX_MESSAGES_PER_WRITE = valueOf("MAX_MESSAGES_PER_WRITE"); public static final ChannelOption<Integer> WRITE_SPIN_COUNT = valueOf("WRITE_SPIN_COUNT"); /** @deprecated */ @Deprecated public static final ChannelOption<Integer> WRITE_BUFFER_HIGH_WATER_MARK = valueOf("WRITE_BUFFER_HIGH_WATER_MARK"); /** @deprecated */ @Deprecated public static final ChannelOption<Integer> WRITE_BUFFER_LOW_WATER_MARK = valueOf("WRITE_BUFFER_LOW_WATER_MARK"); public static final ChannelOption<WriteBufferWaterMark> WRITE_BUFFER_WATER_MARK = valueOf("WRITE_BUFFER_WATER_MARK"); public static final ChannelOption<Boolean> ALLOW_HALF_CLOSURE = valueOf("ALLOW_HALF_CLOSURE"); public static final ChannelOption<Boolean> AUTO_READ = valueOf("AUTO_READ"); public static final ChannelOption<Boolean> AUTO_CLOSE = valueOf("AUTO_CLOSE"); public static final ChannelOption<Boolean> SO_BROADCAST = valueOf("SO_BROADCAST"); public static final ChannelOption<Boolean> SO_KEEPALIVE = valueOf("SO_KEEPALIVE"); public static final ChannelOption<Integer> SO_SNDBUF = valueOf("SO_SNDBUF"); public static final ChannelOption<Integer> SO_RCVBUF = valueOf("SO_RCVBUF"); public static final ChannelOption<Boolean> SO_REUSEADDR = valueOf("SO_REUSEADDR"); public static final ChannelOption<Integer> SO_LINGER = valueOf("SO_LINGER"); public static final ChannelOption<Integer> SO_BACKLOG = valueOf("SO_BACKLOG"); public static final ChannelOption<Integer> SO_TIMEOUT = valueOf("SO_TIMEOUT"); public static final ChannelOption<Integer> IP_TOS = valueOf("IP_TOS"); public static final ChannelOption<InetAddress> IP_MULTICAST_ADDR = valueOf("IP_MULTICAST_ADDR"); public static final ChannelOption<NetworkInterface> IP_MULTICAST_IF = valueOf("IP_MULTICAST_IF"); public static final ChannelOption<Integer> IP_MULTICAST_TTL = valueOf("IP_MULTICAST_TTL"); public static final ChannelOption<Boolean> IP_MULTICAST_LOOP_DISABLED = valueOf("IP_MULTICAST_LOOP_DISABLED"); public static final ChannelOption<Boolean> TCP_NODELAY = valueOf("TCP_NODELAY"); public static final ChannelOption<Boolean> TCP_FASTOPEN_CONNECT = valueOf("TCP_FASTOPEN_CONNECT"); public static final ChannelOption<Integer> TCP_FASTOPEN = valueOf(ChannelOption.class, "TCP_FASTOPEN"); /** @deprecated */ @Deprecated public static final ChannelOption<Boolean> DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION = valueOf("DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION"); public static final ChannelOption<Boolean> SINGLE_EVENTEXECUTOR_PER_GROUP = valueOf("SINGLE_EVENTEXECUTOR_PER_GROUP");
最新发布
03-30
<think>嗯,用户给了一段Java代码,里面有很多ChannelOption的常量定义,看起来是Netty框架里的东西。我需要解释这些选项的作用。首先,我应该确认这些选项属于Netty的哪个部分,对吧?ChannelOption是Netty中用来配置网络通道参数的,每个选项对应不同的配置项。 用户可能想了解这些选项的具体用途,特别是那些被标记为过期的,比如MAX_MESSAGES_PER_READ和WRITE_BUFFER相关的。我需要逐一检查每个选项,给出它们的含义和使用场景。比如,ALLOCATOR是内存分配器,RCVBUF_ALLOCATOR是接收缓冲区分配器,这些关系到Netty的内存管理。 接下来,区分不同类别的选项可能会有帮助。比如有的选项是TCP相关的,如TCP_NODELAY,有的和Socket选项有关,如SO_KEEPALIVE、SO_SNDBUF等。还有多播相关的IP_MULTICAST_TTL。要注意过期的选项,并建议替代方案,比如WRITE_BUFFER_WATER_MARK代替了高水位和低水位标记。 用户可能需要了解如何在实际代码中设置这些选项,比如在Bootstrap或ServerBootstrap中使用.option()方法。此外,一些选项是平台特定的,比如TCP_FASTOPEN,需要操作系统支持。另外,注意SINGLE_EVENTEXECUTOR_PER_GROUP可能影响事件处理的线程模型。 要确保解释清晰,分门别类,用例子说明部分选项的典型配置值。同时,提醒用户注意过时的选项,避免他们使用已被弃用的参数。最后,总结这些选项在Netty中的作用,帮助用户理解如何通过调整它们来优化网络应用的性能或行为。</think>以下是Netty中$ChannelOption$参数的分类解析,这些参数用于配置网络通道的行为特性: --- ### 一、内存管理类 1. **$ALLOCATOR$** - 类型:$ByteBufAllocator$ - 作用:定义内存分配策略(如池化/非池化、堆内存/直接内存) 2. **$RCVBUF_ALLOCATOR$** - 类型:$RecvByteBufAllocator$ - 作用:控制接收缓冲区动态调整策略 3. **$MESSAGE_SIZE_ESTIMATOR$** - 类型:$MessageSizeEstimator$ - 作用:预估消息大小以优化内存分配 --- ### 二、连接控制类 1. **$CONNECT_TIMEOUT_MILLIS$** - 类型:$Integer$ - 作用:设置连接超时时间(单位:毫秒) 2. **$ALLOW_HALF_CLOSURE$** - 类型:$Boolean$ - 作用:允许半关闭连接(如HTTP协议的半关闭模式) --- ### 三、I/O操作优化类 1. **$WRITE_SPIN_COUNT$** - 类型:$Integer$ - 作用:设置写操作自旋次数(避免过度占用CPU) 2. **$MAX_MESSAGES_PER_WRITE$** - 类型:$Integer$ - 作用:单次写循环最大消息数 3. **$WRITE_BUFFER_WATER_MARK$** - 类型:$WriteBufferWaterMark$ - 作用:替换过时的高低水位标记,定义写缓冲区阈值 --- ### 四、Socket参数类 | 参数 | 类型 | 典型配置值 | 作用 | |------|------|------------|------| | $SO_KEEPALIVE$ | $Boolean$ | true | 启用TCP心跳检测 | | $SO_SNDBUF$ | $Integer$ | 32KB | 发送缓冲区大小 | | $TCP_NODELAY$ | $Boolean$ | true | 禁用Nagle算法 | | $SO_BACKLOG$ | $Integer$ | 128 | 等待连接队列长度 | --- ### 五、高级网络特性 1. **$IP_MULTICAST_TTL$** - 类型:$Integer$ - 作用:设置多播数据包的生存时间(TTL) 2. **$TCP_FASTOPEN$** - 类型:$Integer$ - 作用:启用TCP Fast Open(需操作系统支持) --- ### 六、过时参数⚠️ 1. **$MAX_MESSAGES_PER_READ$** - 替代方案:通过$RCVBUF_ALLOCATOR$实现更精细控制 2. **$WRITE_BUFFER_HIGH/LOW_WATER_MARK$** - 替代方案:统一使用$WRITE_BUFFER_WATER_MARK$ --- ### 七、线程模型相关 **$SINGLE_EVENTEXECUTOR_PER_GROUP$** - 类型:$Boolean$ - 作用:控制是否在事件循环组中共享线程资源 --- ### 典型配置示例 ```java ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.TCP_NODELAY, true); ``` --- 通过合理配置这些参数,可以优化网络吞吐量、延迟及资源利用率。需要特别注意不同操作系统对某些参数(如$TCP_FASTOPEN$)的支持差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值