自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 nginx偶发报错:【502】 upstream prematurely closed connection while reading response header from upstream

想起了之前用httpclient调微信接口时也报过类似的错误,原因是用http线程池,服务端关闭了连接,而连接池不知道,发请求时触发,后续httpclient有升级进行相关检查。我给运维的建议是1、设置upstream的keepalive_timeout小于tomcat的connectTimeOut值,2、把max_fails设置为3。运维只同意修改max_fails=3。一段时间后又查看了nginx日志,error.log中依然有错误日志,但是access.log中没有了502,因为重试后都成功了。

2024-04-22 10:24:17 355 1

原创 java websocket服务端丢消息

客户端A往服务端发送了1、2、3三个消息,服务端先处理1、处理完之后才会处理2,然后是3。现象:客户端日志记录发送了心跳消息,服务端没收到心跳,超时后服务端关闭sessionA,客户端新建了会话sessionB,过了会又收到了之前sessionA的消息,由于sessionA已经关闭,所以isOpen 方法返回 false。当然现有消息交互方式也是有问题的,客户端记录发送成功,并不表明真的成功了,所以靠谱的应该是加上业务层的ack,客户端收到服务端的业务ack才真正的是表明消息发送成功了。

2024-04-16 11:13:03 456

原创 g1垃圾回收算法浪费空间场景

线上环境给jvm分配了16g的空间,大概在10g左右触发了Java heap space,频繁的Allocation failure。一个10MB的对象占用了2个region 构成的Humongous区域 (一个region 8M = 16g/2048),剩下的6MB不能被使用。这也正好解释了,为啥16G 内存,使用10G就报内存不够用了。分析了下代码,对于大文件使用的是分块上传,每个块10M。之前有个bug就是在文件上传过程中,这10M的内存是不能释放的,这个跟当前问题有关但还不是重点。

2024-04-15 15:22:24 116

原创 Server-Sent Events(sse)提供流式接口遇到的坑

应用本身属于中转层,一方面需要对接python提供的流式接口,然后对前端提供流式接口。最后继承了SseEmitter,重写extendResponse方法生效了,nginx还是认这个头的。开开心心上线了,产品反馈流式接口没生效,还是阻塞然后一下全返回。直接访问应用对应的代理,接口是正常的。openresty版本是1.7,听说1.8 9都没问题,不过这不在范围内,就没多问了。看了chatgpt提供的接口感觉也不是,于是了解了下,发现使用的是sse,基于http接口实现的,类似文件下载。

2023-11-03 16:04:41 1195 9

原创 apple 用户迁移

苹果用户迁移

2023-06-13 20:13:31 419 7

原创 mysql RR解决了幻读么?

对于幻读实际开发中没必要过于害怕,从而无脑的选择RR。《mysql运维内参》推荐互联网应用默认使用RC隔离级别,一方面是RR导致死锁的情况比较多,另一方面我们实际业务其实是可以接收幻读的。这个场景属于当前读与快照读不一致。这种不一致算不算幻读有争论,暂时没找到比较权威的结论。1、非锁定读(普通的select) 通过 readView 解决幻读。2、锁定读(select for update)通过锁解决幻读。结论:mysql在RR隔离级别下绝大部分场景解决了幻读。

2023-06-13 19:35:22 890

原创 Java直接内存回收

jvm 直接内存 回收

2022-12-09 14:25:45 856 1

原创 java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration

springboot 单元测试

2022-09-28 11:56:35 6996

原创 苹果 服务通知 V2

苹果 服务通知 v2

2021-12-14 11:33:50 8775 20

原创 java8 time包(今天、本周、本月 时间范围)

今天LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX); Date begin = Date.from(todayStart.atZone(ZoneId.systemDefault()).toInstant())

2021-09-14 10:19:38 244

原创 摘要与签名

    摘要算法主要是对一串数据(原始数据)生成固定长度的字符串(摘要)。它是一种不可逆的操作,即通过摘要不能获取到原始数据(彩虹表不算是解密),因为摘要操作会丢失数据的原始信息。常见的摘要算法有:MD5,SHA等。    记得刚开始工作的时候,提供的http接口校验token就是MD5,双方使用相同的salt,如果md5一致 就说明签名合法。    现在对接一些厂商的接口时发现签名都用SHA1withRSA(或更高版本)了。心想使用MD5不行

2021-04-02 19:11:49 755

原创 ubuntu20上编译openjdk8

记录下在ubuntu20下编译openjdk8时遇到的问题。内核信息:Linux yy-virtual-machine 5.4.0-53-generic #59-Ubuntu SMP Wed Oct 21 09:38:44 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux相关执行脚本bash ./configure --with-target-bits=64 --with-boot-jdk=/your/boot/jdk/path --with-debug-level

2020-11-30 11:17:44 848

原创 mysql timestamp比较查询遇到的坑

  记得之前京东要求mysql建表的时候要求update_time 为timestamp,create_time为datetime。后来阿里的编码规范里要求两者都要是datetime类型的。  对于timestamp和datetime的区别好多地方都有介绍。有时在想为什么京东会要求update_time必须timestamp呢?难道是因为占用的空间少点?还是只有timestamp才能设置默认值(on update current_timestamp)?默认值datetime不是也可以设置么。后来百度了下

2020-11-13 15:58:28 1793 2

原创 链表翻转

1、单链表翻转2、两两一组翻转3、k个一组翻转

2020-10-16 10:12:24 127 1

原创 java泛型面试

java泛型泛型本质泛型擦除获取泛型信息泛型本质本质就是语法糖,语法糖就是编译期间发生的,编译之后就没了踪迹。像c++有模板类,java的泛型也达到了类似的效果,但是他们实现的本质是不一样的。因为java有泛型擦除,编译之后就没了相关信息,比如List 和List 是一样的类型,都是List。在c++里就不一样了,对应两个不同的类(如果有叫List的模板类)。泛型擦除既然java语言增加了...

2019-12-13 09:24:30 185

原创 对技术有情怀为啥有时候让人困惑?

 最近看《创新者的窘境》,书本身是讲企业的问题,为啥一些优秀的企业到最后还是黄了。部分内容结合自身的工作有些感触。 第九章产品性能、市场需求和生命周期讲性能过度供给时举了一个关于胰岛素的例子:胰岛素最初是由来至多伦多的研究员从动物胰脏中提取的,既然是从动物内脏提取,当然会有纯度问题。从1925年的50000ppm一直下降到1980的10ppm。大家可能会想是不是纯度越高也会更受市场欢迎,结果可能...

2019-08-11 18:16:48 217

原创 jdbc 驱动加载(SPI)

  在进行业务逻辑开发过程中,和数据库的交互基本都会使用数据库连接池(c3p0,druid等),上层再加上各种框架(hibernate或者mybatis等),对于底层几乎透明。如果让我们手动连接数据库也很简单一句话就可以解决Connection coon = DriverManager.getConnection(“url”,“username”,“password”),获取到coon就可以执行增...

2018-08-02 16:44:43 386

原创 java Condition 等待通知

j.u.c包的Lock实现了synchronized同步的功能,同样await()和signal()实现了wait()和notiffy()一样的等待、通知的功能。一个简单的等待、通知流程(我们让thread1先执行) 说说锁的状态怎么变化的。 第一步:thread1获取到锁,state 0->1 (thread2因为获取不到锁会被阻塞) 第二步:调用await()方法线程会释放...

2018-07-05 14:49:32 213

原创 spring事务传播行为-非事务方式 的理解

  具体的传播行为可以看看搜一下,相关的博客挺多的,现在说一下对隔离级别 PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER中很多解释为 非事务方式运行 的理解。   关于什么是‘非事务方式运行‘问了些人,也看了spring相关解释,都没能解释的让人很明白。从字面上解释就是不在事务中运行,这种理解是不对的。在innodb这种支持事务的存储引擎中,所有的操作都是...

2018-06-14 17:42:21 2021

原创 理解java new关键字

  new关键字在java里用的算是很频繁的了,在程序员角度来看,new就是给我们生成了一个对象,所以java程序员不差对象。我们还是有必要理解的深点,到底是什么个回事。   首先new关键字被编译之后会生成四条字节码指令:new、dup、invokespecial、astore。new底层逻辑比较复杂,主要的功能就是开辟一块空间给这个对象。dup就是把这个对象的空间地址复制一个,因为invok...

2018-04-20 18:40:53 2237

原创 函数指针执行机器指令

  函数指针就是一个指向函数的指针,关于c的忘的差不多了,需要补下。因为jvm执行字节码(模板解释器)主要就是通过函数指针来实现的。字节码属于栈指令,我们的机器可以直接执行的是机器指令,栈指令是不能在机器上直接执行的,要执行归根都会要变为机器指令来执行。   这里来弄下通过函数指针执行机器指令的demo,因为课本上很少有见到介绍这个的。没什么事谁会放着高级语言不用而去弄机器指令呢,主要是感性的认...

2018-04-20 17:47:03 324

原创 java反序列化

  之前介绍过java内置的序列化,今天总结下java的反序列化,主要介绍一点吧,它是怎么跳过构造函数生成对象的,当然跳过不是故意的,因为它本身实现就没依赖构造函数。比如我们定义了一个private的构造函数的bean,它序列化后的数据仍然可以反序列化出来。总之吧,反序列化不会触发构造函数的逻辑。   反序列化时调用链: objectInputStream.readObject()-> ...

2018-04-13 14:53:22 1392 1

原创 ubuntu14 编译openjdk7源码

  product版本的jdk调试的时候很多信息是看不到的,而有时候想看看底层的逻辑必须得跟代码,所以只能自己编译源码使用自己的jdk去查找原因。编译过程中遇到了一些坑,很多都是别人踩过的,这里总结下。   系统:ubuntu14 , 编译jdk版本 hotspot1.7 ,源码 openjdk7   通过https://zhuanlan.zhihu.com/p/23478436 基本可以做好...

2018-04-12 14:14:00 336

原创 Java栈

Java的栈是在方法调用过程中生成的,就单个方法栈而言结构分为:局部变量、固定栈帧、操作数栈。比如方法method1()调用了方法method2(),它们的栈在内存上连续分配,等method2()执行完(遇到ireturn指令)method2()的堆栈就会被自动回收了,method1()和method2()还有堆栈重叠的部分,后续结合图来介绍。单个方法的栈是有大小的,在jvm分配方法栈的时候是根据编

2018-04-10 15:26:08 218

原创 mybatis二级缓存实现--protostuff序列化

背景  在使用mybatis框架自带的二级缓存实现时有个问题就是: 部署多个实例会带来缓存不一致的情况,因为它是使用本地内存。于是有的选择不使用mybatis的二级缓存,干脆自己来写缓存和读缓存,一种普遍的做法就是先从redis中读取,没有就读库,然后再回写缓存供下次使用。这样会有两个问题, 第一 作为开发人员重点关注的应该是数据库,现在还要花费精力来关心缓存 ;第二 数据可能清除的不干净,

2017-12-01 16:10:21 927

原创 使用docker部署第一个war应用

随着docker等容器技术的成熟,使得dev-ops的开发理念得到落实。公司内部提供的容器都是封装好的,于是决定尝试自己在docker上部署第一个应用来练习练习,还是有不少坑的。前提是docker已经在本地安装了,具体安装步骤可以上官网查看。   1、拉取最新的tomcat镜像到本地 sudo docker pull tomcat  2、基于Dockerfile创建镜像文件 dockerfile

2017-08-29 17:11:20 5889

原创 spring不常遇到的问题

最近帮同事解决在使用spring过程中遇到的一些奇怪问题,在这里总结下,归根结底还是基础不扎实,领悟不到位。   spring注入泛型的问题:定义了Map<Long,Object>的成员变量,在运行时内容居然变为了String 为key的元素。当时的情况是使用set注入是没问题的,但是使用Autowire注解就有问题了。使用配置或者注解来实现IOC,在功能上是等效的。当时好奇的是类型不一样咋赋值啊

2017-08-22 14:58:16 433

原创 一张图来理解RPC

企业级的RPC框架像dubbo,thrift体量还是很大的,要拿来自学没有天赋和毅力还是很难的,反正自己下了dubbo的源码之后还没系统的看过一次。本文主要结合一张图来讲解下黄勇写的NettyRpc轻量级的RPC框架,毕竟文件不多,啃下来还是相对容易些,主要是介绍下RPC大概是个什么流程,我们在client调用一个服务方法时, 其到底干了些啥??   客户端我们可以像声明普通的变量一样定义一个

2017-06-23 16:35:11 2029 4

原创 J.U.C包简介

本文主要是在拜读了《java并发编程的艺术》之后的一个总结,对相关重点进行结构性的梳理。这本书写的还是相当赞的,还是比较符合个人的思维方式。《java并发编程实战》阅读起来还是相对晦涩些,建议读者先看《java并发编程的艺术》,再啃《java并发编程实战》这本书,并没有变低或者抬高谁的意思。some words  juc包是jdk1.5之后引入的,并且是以api的方式,是一个叫Doug Le的大神写

2017-06-14 18:51:30 682

mybatis二级缓存--redis实现

背景  在使用mybatis框架自带的二级缓存实现时有个问题就是: 部署多个实例会带来缓存不一致的情况,因为它是使用本地内存。于是有的选择不使用mybatis的二级缓存,干脆自己来写缓存和读缓存,一种普遍的做法就是先从redis中读取,没有就读库,然后再回写缓存供下次使用。这样会有两个问题, 第一 作为开发人员重点关注的应该是数据库,现在还要花费精力来关心缓存 ;第二 数据可能清除的不干净...

2017-06-14 17:19:00 298

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除