-
OutOfMemoryError:Javaheapspace是JVM堆内存耗尽的严重告警,需预防为主、快速止血:立即摘除节点、禁用内存敏感操作;配置-Xms/-Xmx相等、-XX:+HeapDumpOnOutOfMemoryError;用MAT分析hprof定位泄漏;压测中监控GC与对象存活。
-
CarrierThread是JVM复用的OS平台线程,用于承载多个虚拟线程执行;虚拟线程仅在运行时临时挂载其上,遇I/O等阻塞即卸载并复用该线程,非一对一绑定。
-
答案:Java中List去重常用方法包括LinkedHashSet保持顺序、StreamAPI便捷去重、自定义对象需重写equals和hashCode、HashSet高效无序去重,应根据顺序需求和性能选择合适方式。
-
LEFTJOIN更安全是因为它能保留所有一级评论(parent_idISNULL的根节点),而INNERJOIN会过滤掉无子评论的根节点,导致前端漏渲染;实际需用别名r1/r2避免字段歧义,且无限层级需结合Java递归与深度限制。
-
Optional不能彻底消除空指针,它仅封装判空逻辑且仅对Optional类型生效;误用of(null)会立即抛NPE,应优先使用ofNullable()并让方法签名主动返回Optional。
-
Future.get超时后任务仍在运行,必须手动调用cancel(true)中断;重试前需确保上轮任务终止,区分TimeoutException、ExecutionException和InterruptedException处理逻辑,并合理配置线程池。
-
最常用方法是调用目标列表的addAll(),将源列表元素追加到可变目标列表末尾,不改变源列表;需注意目标列表必须可变,否则抛UnsupportedOperationException。
-
不该用return-1或null表示失败,因错误码混淆控制流、易被忽略且缺乏上下文;应按场景选受检异常或RuntimeException,并设计含上下文、异常链的自定义异常。
-
什么时候该调大-XX:CompileThreshold默认值10000意味着方法被解释执行满一万次才触发C1编译,对高并发短生命周期服务(比如SpringBootWebAPI)来说太保守——热点方法还没来得及编译,请求潮就过去了,C2更是遥遥无期。实操建议:-测试环境可先试-XX:CompileThreshold=1500,观察PrintCompilation日志里方法编译延迟是否明显缩短-生产环境慎用低于3000的值,否则C1编译线程争抢CPU,反而拖慢吞吐
-
Thread.interrupted()是静态方法,检查并立即清空中断标志;isInterrupted()是实例方法,只读不改。循环中应每次调用interrupted()检查并清空,避免重复判断;阻塞方法抛InterruptedException时已自动清空中断状态,需在catch块中手动重置。
-
不推荐在toString中输出JSON,因会导致隐式依赖、性能开销、线程安全风险及循环引用异常;应交由日志框架(如Logback的logstash-logback-encoder或Log4j2的JsonLayout)处理,或提供专用toLogJson()方法。
-
在Java中使用Jedis操作Redis,需引入依赖、建立连接并进行数据操作。1.引入Maven依赖:redis.clients:jedis:4.0.1或Gradle配置;2.创建Jedis实例连接Redis,远程访问需配置bind和密码认证;3.执行字符串、哈希、列表等常见数据类型操作;4.使用JedisPool连接池管理连接以提升性能,并合理配置连接参数。
-
Java中Stream.distinct()去重需重写equals()和hashCode()方法且逻辑一致,仅重写equals()会导致HashSet失效;应基于业务字段(如id)实现,避免可变字段,并可通过distinctByKey等替代方案处理无法修改原类的情况。
-
Java中处理字符串多余空格需区分首尾与中间:trim()仅去首尾空白,replaceAll("\s+","")压缩中间连续空白为单空格;推荐组合使用trim().replaceAll("\s+","")或ApacheCommons的StringUtils.normalizeSpace()。
-
普通ThreadLocal无法在父子线程间传递值是因为其值仅绑定当前线程的ThreadLocalMap,子线程为新实例且不复制父线程值;InheritableThreadLocal通过重写createInheritedMap()和childValue(),在子线程init时浅拷贝父线程值,但仅限直接创建的子线程,不适用于线程池等复用场景。