LLLLLuuusa的个人博客 - Java
type: channel
link: https://www.llllluuusa.top/index.php/tag/Java/
items: 连接超时导致消息堆积
items: java面试
items: JNI笔记

连接超时导致消息堆积
type: item
date: 2025-11-18T04:45:51+08:00
description: 问题背景线上生产环境客户反馈,客户在我们的sass系统中点击"同步tiktokshop"时,同步的数据与tiktopshop数据不一致问题描述上午收到阿里云报警,线上MQ某台机器消息堆积严重,其余机器均为正常问题排查初步怀疑sql慢查询问题由于问题主要出现在Proxy同步系统(一个专用于同步的服务),在RDS MySQL的SQL洞察和会话管理模块进行针对性排查,确实有发现慢sql(处理时间0.9秒,高于标准0.5秒),但分析认为不至于产生消息堆积问题尝试在sql查询条件上增加更多索引条件,使sql查询速度降到(0.2s)修复业务逻辑查询过慢问题慢查询主要是因为同步是根据类别分批同步,每次同步都会进行一个总表的关联查询,当同步任务过多时,导致mysql的cpu过载,虽然在阿里云监控上未发现mysql的cpu有峰值,但为避免后续出现问题,这里也同步做修复对查询的总表业务新增一个缓存,键值为同步任务Id,且在开始分发同步任务之前,先查询总表,构建缓存,避免所有的同步任务同时间查询缓存没查到导致走mysql问题问题自测通过以上方法,在测试环境进行压力测试,发现mq依然出现消息堆积问题,进一步排查在同时提醒下,使用jstack分析java线程,发现某一线程一张处于wait状态,导致mq消息堆积 进一步跟踪发现,该进程尝试http请求外网接口,连接一直处于超时配置添加超时时间,解决该问题

java面试
type: item
date: 2025-10-22T08:07:14+08:00
description: Java 基础Java 面向对象有哪些特征封装、继承、多态、(抽象)什么是浅拷贝什么是深拷贝11 浅拷贝指对内存地址的拷贝,如= 深拷贝指对对象属性进行拷贝,如 beanUtilhashcode、==和 equals 的区别hashcode 求值的散列表值,相同值的哈希值一定相等,不同值的哈希值可能相等 ==是比较内存地址 equals 是比较对象,默认不重写的情况下,和==无区别,重写 equals 一般是通过==比较对象里的值是否相等,且重写也要重写 hashcode,否则在将对象存入 hashmap 这样的表时,hashcode 会取内存地址来求哈希值,进而导致不同对象可能存同一 hash 索引位置hashcode 是求键的位置之和,求哈希码,==是比值,equals 是比对象equals 相等/不等,hashcode 和==一定相等/不等 ==相等/不等,hashcode 和 equals 不一定相等/不等 hashcode 相等/不等,equals 和==不一定相等/不等java 代理模式有哪些 静态代理:直接在类里写函数 动态代理:基础接口,实现接口的函数 CGLIB 动态代理:导入 cglib 依赖,创建代理类和工厂类,通过反射来代理 jdk 动态代理和 CGlib 动态代理的取别 只有有接口的类才能使用 jdk 动态代理,它会使用代理类来操作 CGLIB 是没有接口的类会使用这种方法代理,spring 会将类作为父类来生成对于的子类,由子类重写父类方法从而增强补充父类方法.但是如果类被 final 修饰则无法使用 CGLIB 动态代理 理论上,CGLIB 生成代理类慢,调用快,jdk 动态代理生成快,调用慢 异常处理有那种方式 throw:抛出异常,catch(Exception e){throw new Exception("XXX");} throws:声明异常,public int xx(int x, int y) throws xxException {…}； try,cath,finally:捕获异常:try..cath..finally 重写和重载的区别 重载:同一类中,相同的方法不同的参数 重写,子类修改父类的方法 String、StringBuffter、StringBuilder 的区别和使用场景 String 是一个字符串类,其创建的值被放入字符串池,是不可变的,对象的值改变是因为改变了指针 StringBuffter 和 StringBuilder 其创建的值都是可变的,其原理是创建长度固定的数组,向数组里插入字符,数组满了再创建更大的数组,再插入 StringBuffter 使用了 synchronized 保证线程安全,但效率低 一个类如何避免被继承使用 final 修饰的类不能被继承一个类的构造方法被 private 修饰,如何获取这个类的对象将这个类用 static 修饰通过反射暴力破解讲讲你对反射的理解/为什么使用反射反射是获取类对象的一种方法,这种方法提出了一种叫反射机制的概念,其符合开闭原则,即不改变源代码的情况下对原有功能进行拓展,可以通过反射机制而不改变源码来读取操作任意类.反射通常使用在框架的使用上,在 bean 初始化时,其通过反射获取 bean 对象并存储在集合中.在 RPC 里,用反射调用远程传递过来的类对象并进行操作讲讲你对 static 的理解static 可以用来修饰类、函数或变量,让其具有类基本的属性,在类的生命周期中,如果一个变量被 static 修饰,那么其会在初始化阶段被赋予默认值.且如果一个变量是类变量,那么该类下的成员函数和成员变量都可共享使用该类变量自定义异常如何使用继承 RuntimeException,使用 throw new 自定义异常();抛出即可RuntimeException 和 Exception 的区别RuntimeException 是 Exception 的子类,代表运行时出现的异常Exception 的子类包括: RuntimeException:运行时的异常 IOException:读写时的异常 布尔类型可以和整数类型比较吗使用==比较不可以,只有 c++可以 使用 equals 比较指针的话,可以调用完的方法如何被回收方法存放在栈区,调用完成后出栈回收父类有构造函数,子类如何继承若父类构造函数无参,子类直接继承即可,默认会添加上 super(); 若父类构造函数有参,子类继承时需要加入 super(参数);讲讲你对泛型的理解/为什么要使用泛型由于集合存储时不知道对象的类型,会统一以 Object 类型存储,这会导致一些类型安全问题.因此,jdk1.5 后引用了一种泛型的设计,可以指定集合的存储类型,但是其只在编译时起作…

JNI笔记
type: item
date: 2025-03-16T04:40:46+08:00
description: 介绍JNI（Java Native Interface）是 Java 提供的一个接口，用于在 Java 程序中调用非 Java 代码，特别是 C 或 C++ 代码。JNI 使得 Java 程序能够直接与本地代码进行交互，从而提高性能，访问底层操作系统特性，或者利用现有的 C/C++ 库。调用本地方法：通过 JNI，Java 代码可以调用用 C/C++ 编写的本地方法。有些性能要求高的操作，Java 本身可能无法满足，这时可以将这些操作用本地代码实现，并通过 JNI 调用，从而提升性能。简单案例java调用c/c++时,有一下几个步骤需要经历静态代码块定义需要导入的c++动态链接库(用来连接c++方法的,windows后缀是dll,linux是so)定义native方法(静态的本地方法）编译.h头文件c++导入.h头文件,重写java写的本地静态方法编译c++文件为动态链接库java代码通过动态链接库运行public class Study1 { static { // 加载动态链接库(windows是.dll,linux是so) System.loadLibrary("Study1"); } // native方法(静态的本地方法）,需要调用的c函数 public static native int add(int a,int b); public static void main(String[] args) { System.out.println(add(1,2)); } }编译java文件,获取对应的.class编译文件和.h头文件 # 执行编译.java文件,获取.h头文件（旧版本java用的是javah,而不是java -h) javac -h .\src\ .java文件 # 如果.java文件编码不是GBK,还需要指定编码格式 javac -h .\src\ -encoding UTF-8 .\src\Study1.java重写java的native方法(静态的本地方法）,直接重写.h的方法// 重写java的native方法(静态的本地方法） JNIEXPORT jint JNICALL Java_Study1_add(JNIEnv *,jclass,jint a,jint b){ printf("c++代码被调用\n"); return a+b; }编译c++文件,生成动态链接库,得到.dll/.so文件,执行java代码测试结果g++ -o 输出的.dll文件 -fPIC -shared -I"安装的jdk路径\include\win32" -I"安装的jdk路径\include" 编译的.cpp文件 g++ -o study1.dll -fPIC -shared -I"F:\JAVA\JDK\JDK1.8\include\win32" -I"F:\JAVA\JDK\JDK1.8\include" .\src\Study1.cppJNI数据类型在 JNI（Java Native Interface）中，Java 和 Native 代码（通常是 C 或 C++）之间通过特定的数据格式进行交互。以下是 JNI 中常见的数据格式及其对应关系：1. 基本数据类型Java 类型JNI 类型C/C++ 类型booleanjbooleanunsigned char（1字节）bytejbytesigned char（1字节）charjcharunsigned short（2字节）shortjshortshort（2字节）intjintint（4字节）longjlonglong long（8字节）floatjfloatfloat（4字节）doublejdoubledouble（8字节）voidvoidvoid2. 引用类型Java 类型JNI 类型说明StringjstringJava 字符串Objectjobject任意 Java 对象ClassjclassJava 类ThrowablejthrowableJava 异常对象3. 数组类型Java 数组类型JNI 类型C/C++ 类型boolean[]jbooleanArrayjboolean*byte[]jbyteArrayjbyte*char[]jcharArrayjchar*short[]jshortArrayjshort*int[]jintArrayjint*long[]jlongArrayjlong*float[]jfloatArrayjfloat*double[]jdoubleArrayjdouble*Object[]jobjectArrayjobject*4. JNI 中的特殊类型JNI 类型说明jmethodID方法 IDjfieldID字段 IDJNIE…