- 博客(30)
- 收藏
- 关注
原创 强引用、软引用、弱引用、幻象引用之间的区别和联系
对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,当然具体回收时机还是要看垃圾收集策略。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制,比如,通常用来做所谓的 Post-Mortem 清理机制,我在专栏上一讲中介绍的 Java 平台自身 Cleaner 机制等,也有人利用幻象引用监控对象的创建和销毁。不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。
2023-09-03 17:47:52
340
原创 Java j.u.c并发包里都有些啥?
java.util.concurrent 包提供的容器(Queue、List、Set)、Map,从命名上可以大概区分为 Concurrent*、CopyOnWrite和 Blocking等三类。
2023-08-24 23:55:58
158
原创 类是怎么加载的?双亲委派模型?
Java 的类加载过程分为三个主要步骤:加载、链接、初始化首先是加载阶段(Loading),它是 Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象),这里的数据源可能是各种各样的形态,如 jar 文件、class 文件,甚至是网络数据源等;如果输入数据不是 ClassFile 的结构,则会抛出 ClassFormatError。**加载阶段是用户参与的阶段,我们可以自定义类加载器,去实现自己的类加载过程。
2023-08-22 22:53:54
113
原创 Java中的List和Map
我们可以看到 Java 的集合框架,Collection 接口是所有集合的根,然后扩展开提供了三大类集合,分别是:List,Set,Queue。
2023-08-20 23:36:11
145
原创 Java的IO方式
Java IO 方式有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。首先,传统的 java.io 包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。java.io 包的好处是代码比较简单、直观,缺点则是 IO 效率和扩展性存在局限性,容易成为应用性能的瓶颈。
2023-08-20 17:39:29
147
原创 Exception和Error有什么区别
Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
2023-08-16 23:48:02
106
原创 如何使用Java生成PDF文件
iText 2 以上版本有一个许可协议默认的iText字体设置不支持中文字体,需要下载字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。
2023-08-16 23:10:40
1528
原创 insert on duplicate key update多个唯一索引踩坑
可以看出,id=1和id=2两行都匹配到了,但是只更新了一行数据,受影响的行数为2。(按索引被添加到表上的顺序排序)。on duplicate key update 这个语义的逻辑是,插入一行数据,如果碰到唯一键约束,就执行后面的更新语句。这里需要注意的是:如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。举例:表test_tbl有如下数据,但是有两个唯一索引:UNIQUE KEY a (如果该表中,由多个唯一索引,需要特别注意,出现重复时则该语句只能更新其中一行记录。
2023-08-15 00:02:53
2368
原创 MySQL的日志系统
MySQL体系结构与查询流程不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的 主角:redo log(重做日志)和 binlog(归档日志)。如果接触 MySQL,那这两个词肯 定是绕不过的,我后面的内容里也会不断地和你强调。不过话说回来,redo log 和 binlog 在设计上有很多有意思的地方,这些设计思路也可以用到你自己的程序里。
2023-08-13 16:53:09
155
原创 MySQL join是怎么工作的
首先准备t1 t2表可以看到,这两个表都有一个主键索引 id 和一个索引 a,字段 b 上无索引。存储过程 idata() 往表 t2 里插入了 1000 行数据,在表 t1 里插入的是 100 行数据。
2023-08-13 16:46:44
87
原创 MySQL order by是怎么工作的
Extra 这个字段中的“Using filesort”表示的就是需要排序,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。满足 city='杭州’条件的行,是从 ID_X 到 ID_(X+N) 的这些记录。我们暂且把这个排序过程,称为全字段排序,执行流程的示意图如下所示,下一篇文章中我们还会用到这个排序。“按 name 排序”这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数 sort_buffer_size。
2023-08-13 16:44:14
75
原创 Mybatis源码解析
/拦截实现的方法@Override//插入@Override//设置属性(扩展)@Override内部我们是调用我们的四大对象之一Executor来进行实际的增删改查的,然后就是对我们传入参数进行两次包装的过程,紧接着我们创建了四大对象之二StatementHandler,我们通过StatementHandler来执行预编译,插入值,执行sql,封装结果这四大步骤。
2023-08-09 23:25:53
56
原创 设计模式-结构型-享元模式
享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。享元模式的主要优点是:相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。享元模式的主要角色有如下。
2023-08-09 23:21:20
51
原创 Spring事务的传播机制
操作:将ServiceA事务传播机制修改为@Transactional(propagation=Propagation.NOT_SUPPORTED),ServiceB的仍为@Transactional(propagation=Propagation.MANDATORY),查看是否报错。回滚机制:如果调用方开启事务,则加入同一个事务,不论谁异常,都会整体回滚,如果调用方没开启事务,则抛出异常,被调方回滚。结果:ServiceA有事务,ServiceB将ServiceA事务挂起,创建新事务。
2023-08-09 23:16:18
49
原创 安全-凭证
这句话的言外之意是提醒读者,接下来的 JWT 令牌与 Cookie-Session 并不是完全对等的解决方案,它只用来处理认证授权问题,充其量能携带少量非敏感的信息,只是 Cookie-Session 在认证授权问题上的替代品,而不能说 JWT 要比 Cookie-Session 更加先进,更不可能全面取代 Cookie-Session 机制。所以关键在于生成JWT,和解析JWT这两个地方。需要注意的是,默认情况下JWT是未加密的,任何人都可以解读其内容,因此如果一些敏感信息不要存放在此,以防信息泄露。
2023-08-07 23:33:37
80
原创 安全-传输
正是因为这个特点,网站就可以在自己的证书中公开自己的公钥,并使用自己的私钥将自己的身份信息进行加密一起公开出来,这段被私钥加密的信息就是证书的数字签名,浏览器在获取到证书之后,通过证书里的公钥对签名进行解密,如果能成功解密,则说明证书确实是由这个网站发布的,因为只有这个网站知道他自己的私钥(如果他的私钥没有泄露的话)。你能够信任他的方式是向对方询问一些你们两个应该知道,且只有你们两个知道的私密信息,如果对方能够回答上来,他有可能真的是你的老同学,否则他十有八九就是个诈骗犯。
2023-08-07 23:32:57
58
原创 设计模式-创建型-原型模式
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决:在运行期建立和删除原型。1、当一个系统应该独立于它的产品创建,构成和表示时。2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。3、为了避免创建一个与产品类层次平行的工厂类层次时。4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。
2023-08-07 23:27:15
65
原创 设计模式-创建型-单例模式
那么步骤3执行后 singleton 已经不为 null ,但是未执行步骤2,singleton对象初始化不完全,此时线程B执行 getInstance() 方法,第一步判断时 singleton 不为null,则直接将未完全初始化的singleton对象返回了。代码时,恰好这三个步骤重排序后为1 3 2,如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的,同时还会禁止指令重排序。单例模式并不是绝对安全的,可以通过反射来破坏,只有枚举安全类是安全的。
2023-08-07 23:26:25
61
原创 yyyyMMdd,YYYYMMdd,yyyymmdd有什么区别
字母日期或时间元素表示示例GEra 标志符TextADy年Year1996;96M年中的月份MonthJuly;Jul;07w年中的周数Number27W月份中的周数Number2D年中的天数Number189d月份中的天数Number10F月份中的星期Number2E星期中的天数TextTuesday;TueaAm/pm 标记TextPMH一天中的小时数(0-23)Number0k一天中的小时数(1-24)Number24K。
2023-08-07 00:04:36
1572
原创 kafka超时异常
当消费完了再去同步游标报错了,然后游标回滚,导致部分重复消费。KIP-62后不通过poll()方法发送心跳,而是后台一个心跳线程,这就允许单次poll处理更长时间。 3,4配合使用,告诉kafka集群,在我没事情干的时候,多久尝试拉取一次数据,即使此时没有数据(所以要处理空消息) 5,6配合使用,告诉kafka集群,什么情况你可以认为整个消费者挂了,触发rebanlance。 1,2配合使用,告诉kafka集群,我消费者的处理能力,每秒至少能消费掉。检测消费者处理线程死亡。
2023-08-07 00:03:19
369
原创 JVM参数设置
JVM参数设置1、堆设置-Xms:初始堆大小-Xmx:最大堆大小-XX:NewSize=n:设置年轻代大小-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5-XX:MaxPermSize=n:设置持久代大
2023-08-07 00:01:40
429
原创 深复制与浅复制
Object中的clone()方法在对某个对象实施克隆时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是Shallow Clone。这样的话如果有一个类为ClassA,它里面有一个域a不是基本类型的变量,而是一个reference变量,经过Clone之后克隆类只会产生一个新的A类型的引用,它和原始引用都指向同一个a对象,这样克隆类就和原始类共享了一部分信息,这就是浅复制。(八种基本类型除外,他们可以自动实现深复制)
2023-08-06 23:46:57
55
原创 分布式session
基于redis等第三方工具实现,不管请求到哪个服务器,都把session信息,保存在redis中。这种方案,是目前大家普遍在用的,但是它也需要对redis进行高可用性维护,增加了系统复杂度。基于nginx实现,做负载均衡的时候,根据ip做hash处理。比如IP尾号为1、3、5、7、9的请求到服务A上,IP尾号为2、4、6、8、0的请求到服务B上。就可以解决session问题,固定的ip会分配到固定服务器上。服务器不需存储session,用户保存自己的session信息到cookie中。
2023-08-06 23:44:27
44
原创 MySQL数据库编码
其他类型的排序规则是cs(区分大小写),用于区分大小写的文本数据,以及bin(编码需要匹配),逐位排序,适用于真正编码的二进制数据(例如,包括Base64)的字段。区分大小写的排序会导致一些奇怪的结果,区分大小写的比较会导致重复的值只在字母大小写上有所不同。utf8mb4_unicode_ci:是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。UTF-8是使用1~4个字节,一种变长的编码格式,字符编码。
2023-08-06 23:41:16
176
原创 彻底搞懂MySQL TimeStamp的时区问题
MySQL驱动在发送sql前,会将jdbc中的Date对象参数,根据serverTimeZone配置的时区转化为日期字符串后,再发送sql请求给MySQL server,同样在MySQL server返回查询结果后,结果中的日期值也是日期字符串,MySQL驱动会根据serverTimeZone配置的时区,将日期字符串转化为Date对象。因此,当serverTimeZone与数据库实际时区不一致时,会发生时区转换错误,导致时间偏差,如下:比如一个时间值是东8区的。
2023-08-06 23:39:13
4626
1
原创 字符集和字符编码有什么区别
当我们将字符(包括文字、数字、符号等)存入计算机时, 需要将字符转换为计算机能够理解的二进制传输或存储。字符集:是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符编码:是一套法则,使用该法则能够对自然语言的字符与数字系统进行配对。
2023-08-06 23:31:20
328
原创 如何解决MySQL深分页
在每次返回数据的时候,都将当前页的最大id和最小id返回给前端,然后前端在请求上一页/下一页数据的时候,带上这个minId和maxId,这样使用id进行过滤,这样能有效避免大量数据排序问题。
2023-08-06 23:27:43
240
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人