- 博客(31)
- 收藏
- 关注
原创 云原生环境Jvm内存占用持续高位问题排查
但是云原生上也要注意,jvm内存的设置占limit的比例不能太大,如果太大,在其他地方也用到一些内存的时候,操作系统会觉得内存不够用,申请更多内存,再来就是,内存分配给jvm后,就是由jvm负责管理了,你堆内存GC,把某块内存标记为空闲,这都是jvm内部的事,操作系统并不知情。综上所述,即使jvm GC后没有内存泄露,操作系统可能还是会认为jvm占用了比较大的内存空间,这个一般是没有什么问题的。经过几轮实验,发现gc后jvm内存占用大幅减少,基本上没占什么内存了,这说明并不存在内存泄露的情况。
2025-04-10 14:13:06
463
原创 Http、tcp、https、socket、tomcat、长短连接等总结回顾
(1)关于http、tcp的长短连接问题tcp是没有所谓长连接的概念的。tcp经过三次握手就已经建立了一个连接,这个所谓建立了一个连接就是两边操作系统层面都已经建立了socket,都准备好了相应的缓冲区等。socket是啥呢?socket其实就是操作系统提供tcp连接的接口。比如tcp的可能有第一次握手的方法,是C语言写的,比如就叫syn方法,对应第一次握手,也就是客户端发一个syn位置1的tcp消息嘛;
2025-03-01 22:40:59
939
原创 从ArrayList迭代器看抛异常的理念:有问题应该早点抛异常,而不应看起来运行正常!!
可以看到,Itr是一个private的内部类,加了private让其他类和对象都没法直接访问这个类,也就保证了这个迭代器是ArrayList仅用于自身的类,对外隐藏了实现细节。显然,不同集合的迭代器是不一样的,比如LinkedList的迭代器,它获取元素next元素的方法一定不会是cursor++,而肯定是指针指向下一个元素。也许你会觉得,如果有这样特殊的情况存在,就显得这个设计非常不优雅了,这算哪门子的封装嘛,竟还有这种让人头大的特殊情况。这里有(1)(2)两点,(1)只是顺便一说,重点是(2)
2025-02-19 00:52:12
263
原创 volatile关键字
指令重排后原本(1)(2)(3)的顺序可能变成(1)(3)(2),这样有可能线程A执行完(1)(3),正要执行(2)的时候,线程B抢到执行权,判断lazyMan == null,为false,于是返回对象,但是此时的对象还并没有初始化,这时候去使用此对象显然会有问题。所谓指令重排,就是虚拟机在执行执行时,不考虑并发的影响,再保证结果不变的情况下,将部分指令重新排序的现象,也就是所谓的“线程内表现为串行”(With-Thread as-if-serial semantics).volatile可以保证。
2025-01-01 21:19:58
573
原创 LeetCode第65题 有效数字 结合设计模式:状态模式
用设计模式则非常清楚。但是设计模式是为了给人理解的,对机器而言也可能稍微影响性能;注意:这样写出来的代码经测试用时2ms,不如直接面向过程的if-else大法。单纯用状态机会有大量的if-else,非常不好看,思路不清晰。思路:有限状态机,结合Java的设计模式:状态模式。
2024-08-27 23:32:59
453
原创 力扣LeetCode第29题:两数相除,beat100%解法
时间复杂度: O(logN),其中N为被除数和除数倍数差,也即商。logN即为被除数和除数二进制的位数差,比如1011111/11,那么logN为7−2=5。空间复杂度: O(1)
2024-08-08 23:40:23
717
2
原创 leetcode力扣第29题:两数相除
(2)对于每一个可能得商,跟除数相乘,然后跟被除数比大小,根据大小关系来决定商应该去左边区间还是右边区间。这里不能直接用乘法,所以得用类似于二进制竖式的方式,快速通过加法结合位移运算实现“快速乘法”如果被除数是2^31-1或差不多大小的数,而除数是1差不多大小的数,那循环减法要执行的次数太多,一定会超时。最简单的做法是直接用减法,不停循环计数,最后统计减多少次能成。这题看似简单,实则一点也不难(不是),实则还是比较困难。还有一些细节上的难点,代码注释中写得很清楚。(1)通过二分法查找可能的商。
2024-08-05 23:07:11
589
1
原创 Integer比较大小的奇怪问题
从下面的源码可知,Integer对象的value一旦赋值是不可变的,因此要换value只能是换个Integer对象,然后把引用指向新的对象。这是因为java内部使用了享元模式,对-128到127之间的对象进行了缓存复用,所以a1、a2同一个对象。首先,两个对象比较是比较内存地址。也就是说,两个Integer直接比较是不会触发自动拆箱的。显然不是这样的,这和String类似,实际上再赋值,a1的内存地址就变了。那么为啥a1 == a2是true,a3 == a4却是false呢。
2024-07-24 12:33:53
571
原创 复习:归并排序
最好时间复杂度、最坏时间复杂度、平均时间复杂度都是o(nlog2n)* 和堆排序、快速排序的时间复杂度一样。* 空间复杂度:o(n)
2024-07-22 23:31:55
244
原创 堆排序:最复杂的排序算法之一,但也没那么难
个人认为主要的麻烦在于一些临界条件的判断,比如是i还是i-1,是size还是size-1?快排的话数据集中在一起,更满足缓存的局部性原理?时间复杂度和快速排序一样也是o(nlog2n)据说是因为有很多不必要的交换。其实跑一下调式一下也就好了。但实际表现往往不如快排。最复杂的排序算法之一。
2024-07-21 17:07:08
164
原创 简单选择排序
注意此算法不稳定;即不能保证两个相同大小的元素在排序前后的顺序一致。* 时间复杂度,无论初始序列为顺序、逆序、乱序,都是o(n^2)
2024-07-21 12:28:14
111
原创 分布式缓存复习
这里存在一个问题,就是比如A机器修改数据库数据为1,他刚要改缓存,可能因为机器卡顿、网络卡顿等各种原因,改的比较慢,他还没改,B机器把数据库数据改为2,并且把缓存改为2了,这时候A机器又把缓存改为1了。首先,显然这也数据不一致的问题,其次,先写数据库,后写缓存,缓存跟着数据库走,稍微有点延迟,这叫最终一致。更严重的情况是,一般写操作在更新数据库之后都会更新缓存,或者先使缓存失效再更新数据库,无论怎么做,如果使用本地缓存,都只能保证当前机器的混存一致性,而其他机器则会继续缓存错误的数据。
2024-07-16 00:29:15
868
原创 RabbitMQ复习
路由键与队 列名完全匹配,如果一个队列绑定到交换 机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发 “dog.puppy”,也不会转发“dog.guard” 等等。它是完全匹配、单播的模式。为了保证可靠传输,除了上述的消息确认机制外,还需做好容错方法(try-catch),因为网络波动等原因直接在发送端就没能发送消息是常有的情况,这时候需要有重试机制。multiple为true表示批量确认,即确认此消息的tag号及其之前的所有消息,有的想TCP通信中的确认。
2024-07-15 20:48:00
785
原创 基础回顾:啥叫前后端分离
你可以把这种vue项目叫做前端项目,但是把浏览器当做前端的话,那他这个相对而言也是一个。你后端用java写,用python写,用C写等等,我不care,反正我就是请求某个。如果你把vue项目跑起来,他可以提供各种页面及其跳转逻辑,这个也是在服务器上跑的,比如vue的路由就可以实现。至于你前端拿到这个数据怎么展示那是你的事,你可以用特别炫酷好看的页面来展示,这个页面的跳转,显然还是要发请求,但是这个请求不是发给java等后端工程了,给你这个数据(注意,我只给你数据,不给你页面,不会给你返回html啥的),
2024-07-15 16:09:12
428
原创 Springboot引入依赖自动注入bean的实现
注意:通常来说一个第三方包都会注册很多的bean到容器中,因此spring.factories中可以写一个标注了@Configuration的类,引入了这个类,他下面所有的@Bean标注的方法注册的bean都会放到容器中了。2、使用者主动用@Import引入,这个也没能实现自动注册,可以直接引入(比如)User.class,也可引入@Configuration加@Bean的类。3、用自定义的@Enable封装一下第二步的@Import结果,好处是更好看点,缺点是还是需要使用者主动引入。
2024-07-09 18:41:17
412
原创 分布式系统的CAP定理
如果比如某个从节点和主节点之间的通信断掉了,系统出现了分区(partition),这个时候一致性C和可用性A就只能选一个了。比如更新主库x=1变为x=2,如果主库更新后不等从库更新(比如只是通过binlog异步更新从库的数据),立即返回成功,这样保证了可用性,但如果有人访问到还没更新的从库,就会得到旧数据,这就不满足一致性了。分区容错性是说,即使网络有故障,比如某个从节点和主节点之间的通信断掉了,系统出现了分区(partition),整个系统仍能正常运行(partition tolerance)。
2024-06-19 22:46:52
447
原创 utf8和utf8 bom的区别以及由此产生的对字符编码的思考
在UCS 编码中有一个叫做 "Zero Width No-Break Space" ,中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。感觉还是没太明白,先简单理解就是(本文后面会再来研究这个问题),BOM这个标记是用来表示文件编码信息的。查阅资料可知,BOM是Byte Order Mark的缩写,是用来标记文件编码的大小端的(这个后面讲),UTF8是不需要标记大小端的。utf8编码的只占0个字节,而utf8 bom编码的,虽然文本内容为空白,但已经占用了3个字节。用notepad看下,果然是你!
2024-05-25 10:21:12
1419
原创 安全研发总结(二):XSS攻击及其防御
攻击成功后,攻击者可能获取用户的敏感信息,如Cookie、会话信息等,甚至执行更高权限的操作,如劫持用户会话、插入恶意内容、重定向用户到恶意网站等。攻击者通过利用网页开发时留下的漏洞,注入恶意代码到网页中。仔细看看会发现,xss攻击其实和sql注入攻击很像,都是通过输入一些未预期的参数来扭曲原本的语义,只不过前者扭曲的sql语句,后者扭曲的是html便签。在过滤器中加上一个全局的输入转义或输入转义即可,由于post请求中可能带有 < > & 等符号,为了防止正常输入被转义后无法识别,建议只对输出转义即可。
2024-05-20 21:46:34
431
原创 安全研发总结(一):SQL注入漏洞及其防御
(1)使用预编译的sql,即PreparedStatement,这是最好的办法。的sql就已经被数据库编译、优化了,后续传入的参数不会被认为是sql指令,而只是当做一个值注入占位符,由于不存在sql的重新编译,因此也不可能改变其原有的语义,不存在sql注入的可能。这里注意,转义是对传入的参数转义,而非对整个sql语句转义。SQL注入是一种安全漏洞,攻击者通过影响Web应用程序的后端数据库执行未授权的SQL命令。这通常是通过将恶意SQL代码注入到应用程序的输入字段中实现的,例如通过在搜索框中输入。
2024-05-19 21:25:07
519
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人