邯城往事 邯城往事
Tags Archives Links
  • 开始使用
  • 我的开源
  • 服务器倒计时
  • Tags
  • Archives
  • Links
  • Search
  • RSS
TCP三次握手 在后端相关岗位的入职面试中,三次握手的出场频率非常的高。其实在三次握手的过程中,不仅仅是一个握手包的发送 和 TCP 状态的流转。还包含了端口选择,连接队列创建与处理等很多关键技术点。通过今天一篇文章,我们深度去了解了三次握手过程中内核中的这些内部操作。 全文洋洋洒洒上万字字,其实可以用一幅图总结起来。 服务器 listen 时,计算了全/半连接队列的长度,还申请了相关内存并初始化。 客户端 connect 时,把本地 socket 状态设置成了 TCP_SYN_SENT,选则一个可用的端口,发出 SYN 握手请求并启动重传定时器。 服务器响应 ack 时,会判断下接收队列是否满了,满的话可能会丢弃该请求。否则发出 synack,申请 request_sock 添加到半连接队列中,同时启动定时器。 客户端响应 synack 时,清除了 connect 时设置的重传定时器,把当前 socket 状态设置为 ESTABLISHED,开启保活计时器后发出第三次握手的 ack 确认。 服务器响应 ack 时,把对应半连接对象删除,创建了新的 sock 后加入到全连接队列中,最后....

TCP三次握手与四次挥手

tcp
#先参考我之前的一篇文章在服务器进行一个死锁的情景重现# 检测死锁的文章 查看java进程 ps -ef|grep java 针对进程id生成dump文件 jmap -dump:format=b,file=serviceDump.dat 14640 使用jvisualvm.exe对dump进行分析(如果jdk的bin目录下没有,需要自行下载) https://visualvm.github.io/index.html 修改visualvm.conf 加入JDK 路径 visualvm_jdkhome="C:/Users/JavaCoder/.jdks/corretto-1.8.0_312" 双击bin目录下的visualvm.exe打开 导入dump文件后查看死锁的线程 还有另外一种使用方式 jhat : jhat 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果 C:\Users\SnailClimb>jhat C:\Users\SnailClimb\Desktop\heap.hprof Reading from C:....

分析linux的java进程的dump文件

java
分布式ID生成策略常见的有如下几种: 数据库自增ID。 UUID生成。 Redis的原子自增方式。 数据库水平拆分,设置初始值和相同的自增步长。 批量申请自增ID。 雪花算法。 百度UidGenerator算法(基于雪花算法实现自定义时间戳)。 美团Leaf算法(依赖于数据库,ZK)。 本文主要介绍SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。 其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,保持自增性且不重复。 雪花算法的结构: 主要分为 5 个部分: 是 1 个 bit:0,这个是无意义的。 是 41 个 bit:表示的是时间戳。 是 10 个 bit:表示的是机房 id,0000000000,因为我传进去的就是0。 是 12 个 bit:表示的序号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号,0000 0000 0000。   接下去我们来解释一下四个部分: 1 bit,是无意义的:   因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们....

(转)雪花算法snowflake

java
锁的优化 Lock没有引入锁的升级这个概念,只有普通的自旋和偏向锁 synchronized 拥有锁的升级,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁 等技术来减少锁操作的开销。并且还会随着竞争的激烈而逐渐升级 可中断 synchronized 是不可以被中断的,但Lock是可以中断它的,Lock中断的代码见下方: package com.example.demo; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应, * 在一个线程等待锁的过程中,可以被打断 */ public class 中断锁 { public static void main(String[] args) { Lock lock = new ReentrantL.......

Synchronized和Lock怎么选?

java
volatile用来解决并发编程中的可见性问题和指令重排序问题 可见性问题 如下这段代码,就需要增加volatile字段来确保可见性 可见性问题及cpu的解决办法 在整个计算机的发展历程中,除了CPU、内存以及I/O设备不断迭代升级来提升计算机处理性能之外, 还有一个非常核心的矛盾点,就是这三者在处理速度的差异。CPU的计算速度是非常快的,其次是内 存、最后是IO设备(比如磁盘),也就是CPU的计算速度远远高于内存以及磁盘设备的I/O速度。 最大化的利用CPU。所以在硬件层面、操作系统层面、编译器层面做出了很 多的优化 CPU增加了高速缓存 操作系统增加了进程、线程。通过CPU的时间片切换最大化的提升CPU的使用率 编译器的指令优化,更合理的去利用好CPU的高速缓存 每一种优化,都会带来相应的问题,而这些问题是导致线程安全性问题的根源,那接下来我们逐步去了 解这些优化的本质和带来的问题。 cpu缓存一致性问题及解决办法 既然用到了缓存,而且每个cpu都拥有自己的缓存,那么就会有缓存一致性问题,cpu针对这一问题采用的解决办法是增加总线锁和缓存锁 指令重排序问题及cpu的解决办法 对于主....

volatile关键字的理解

java
为什么要用synchornized? 由于多线程编程时引发的线程安全问题,所以要用synchornized. 多线程编程,会有原子性,可见性,有序性的问题 使用synchornized可以解决原子性,可见性和有序性需要使用volatile关键字解决 synchornized怎么使用? 当synchornized里填入成员变量或者成员方法或者代码块的时候,表示这个锁只针对这一个实例对象有效. 当synchornized里填入静态对象或者静态方法或者.class的时候,表示这个锁针对这个类的所有实例对象 为什么在synchornized的小括号里填入任何对象都可以锁? synchornized(this),synchornized("1"),synchornized(User.class),这几种都可以实现锁,因为无论是this还是"1"还是User.class,它们都含有java对象头MarkWord 何为MarkWord? 在Hotspot虚拟机中,对象在内存中的存储布局,可以分为三个区域:对象头(Header)、实例数据 (Instance Data)、对齐填充(Padding)。 ....

synchronized关键字的理解

java
准备工作 安装含有jstack的java版本 yum whatprovides '*/jmap' 然后从查询结果里安装适合自己服务器的版本: yum install -y java-1.8.0-openjdk-devel-slowdebug-1:1.8.0.312.b07-2.al8.x86_64 下载可以制造死锁和死循环的项目代码 threaddemo0.0.1SNAPSHOT.jar 运行项目 nohup java -jar -Dserver.port=8088 thread-demo-0.0.1-SNAPSHOT.jar >all.log & 制造死锁 curl http://127.0.0.1/dead 显示所有当前运行的pid jps 使用jstack pid来查看死锁的信息 制造死循环 curl http://127.0.0.1/loop 使用top -c命令查看满负荷的那个java进程,我这里的进程id是436256 使用top -H -p 436256查看cpu利用率高的线程,我这里利用率高的线程id是443233 然后将443233这....

排查java项目中的死锁和死循环

排查
#!/bin/bash hostname=hostname old_hostname=grep -Ev '^$|^#' /etc/zabbix/zabbix_agentd.conf | grep Hostname sed -i "s#old_hostname#Hostname=hostname#g" /etc/zabbix/zabbix_agentd.conf systemctl restart zabbix-agent 下发: ansible -i hosts.work new-openstack -m shell -a "netstat -lntup | grep 10050" ansible -i hosts.work new-openstack-ceph -m shell -a "cat /etc/zabbix/zabbix_agentd.conf | grep 172.24.15.122" ansible -i hosts.work new-openstack -m copy -a "src=/root/test.sh dest=/tmp/test.sh" a....

修改Hostname值

zabbix
[root@system-wiki ~]# cat /usr/lib/systemd/system/wiki.service [Unit] Description=Wiki [Service] Type=simple PIDFile=/usr/local/atlassian/confluence/work/catalina.pid ExecStartPre=rm -rf /usr/local/atlassian/confluence/work/catalina.pid ExecStart=/usr/local/atlassian/confluence/bin/startup.sh ExecStop=/usr/local/atlassian/confluence/bin/shutdown.sh PrivateTmp=true Restart=always User=confluence Group=confluence [Install] WantedBy=multi-user.target pid设置文件:/usr/local/atlassian/confluence/bin/s.......

confluence自启动

Linux
D:. │ pom.xml └─src └─main ├─java │ └─com │ └─gupaoedu │ └─vip │ └─spring │ └─framework │ ├─annotation │ │ GPAutowired.java │ │ GPController.java │ │ GPRequestMapping.java │ │ GPRequestParam.java │ │ GPService.java │ │ │ ├─aop │ │ │ GPAopProxy.java #Aop顶层接口 │ │ │ GPCglibAopPorxy.java #CglibAop实现类 │ │ │ GPDefaultAopProxyFactory.java #策略选择Cglib还是Jdk │ │ │ GPJdkDynamicAopProxy.java #JdkAop实现类 │ │ │ │ │ ├─aspect │ │ │ GPAbstractAspectJAdvice.java #切面通知的抽象父类 │ │ │ GPAdvice.java....

Spring的30个关键类

java
添加硬盘后,输入如下命令可识别: echo '- - -' > /sys/class/scsi_host/host0/scan #vm虚拟机扫描硬盘并识别硬盘

vmware添加硬盘识别问题

vmware
准备工作 准备jdk1.8、maven-3.6.0并配置环境变量 sonarqube下载(7.8版本之后不支持jdk1.8) 下载官网 mysql数据库(5.6-8.0) 步骤二:sonarqube安装和配置篇 下载好sonarqube后,解压打开bin目录,启动相应OS目录下的StartSonar。 如本文演示使用的是win的64位系统,则打开E:\sonar\sonarqube-7.6\bin\windows-x86-64\StartSonar.bat 然后修改 sonarqube-7.6\conf\wrapper.conf 修改本地的javapath,注意后缀要配置为 \bin\java 将其中的 wrapper.java.command=C:\Users\JavaCoder.jdks\corretto-1.8.0_312\bin\java 先使用管理员运行 InstallNTService.bat 然后使用管理员运行 StartNTService.bat 然后使用管理员运行 StartSonar.bat 然后访问 http://localhost:9000 配置数据库(避免......

windows使用sonarqube测试覆盖率

java
引入junit包依赖 <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> 直接贴代码不bb 测试接口的代码 package com.example.merrychristmas.web; import com.example.merrychristmas.controller.IndexController; import com.example.merrychristmas.entity.User; import org.junit.Before; import org.junit.Test; import org.junit.runner.....

Junit4单元测试web接口和service方法

java
自定义注解,用于Aop切入点 ModelSumbit.java package com.yjy.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface ModelSumbit{ String value() default ""; } 新建切面类 LogAdvice.java package com.lyf.aspect; import com.lyf.service.LogService; import com.lyf.utils.SqlUtils; import org.apache.ibatis.session.SqlSessio....

Spring Aop实现动态获取mapper执行的SQL

java
拉取最新镜像 docker pull mysql:latest ^也可以去https://hub.docker.com/_/mysql?tab=tags安装指定版本号的镜像^ 运行mysql容器 docker run -itd --name mysql8.0 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.27 (注:-p 3306:3306 左边的是容器的端口号,右边的是服务器的端口号。服务器的端口可以直接映射到容器的端口号上) (注:123456 是数据库的密码可自行修改) (注:8.0.27 是数据库的版本根据自己的版本进行更改,如何输入错误可能会导致在次拉取镜像) 查看容器状态 docker ps 进入MySQL容器登录MySQL docker exec -it mysql8.0 bash 登录Mysql mysql -u root -p 然后开启阿里云服务器的3306端口 连接成功!

Docker安装配置mysql镜像

Docker
第一种方式:在容器内部修改配置文件实现代理 拉取镜像 docker pull nginx 启动容器 docker run --name nginxweb -p 8080:80 -d nginx 此时可以打开网站 ip:8080 访问nginx首页 进入容器 docker exec -it nginxweb /bin/bash 更新源的索引,这样才能获取到最新的软件包 apt-get update 安装vim apt-get install vim 如果是将80映射为其他端口,需要注释掉最下面的那句默认的配置 #include /etc/nginx/conf.d/*.conf; 新增一个server配置如下,其他地方都不用动: server{ listen 80; server_name localhost; location /MerryChristmas/ { proxy_pass http://ip:63302/index/v1; proxy_redirect default; } } 访问代理的地址(:80可省略) ip:80/MerryChristmas 修改后校....

Docker安装配置nginx镜像

Docker
运行sql建表加数据 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId --课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩表 SC(SId,CId,score) --SId 学生编号,CId 课程编号,score 分数 测试数据 create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)); insert into Student values('01' , '赵雷' , '1990-01-01' , '男'); insert into Student values('02' , '钱电' , '1990-12-21' , '男'); insert into Student value.....

Mysql执行计划

mysql
场景: 使用window.location.href="../../../cleangame/index.html?playgame=" + ('#email').val();跳转到项目内一个页面,并且携带中文参数 解决方法: //根据参数部分和参数名来获取参数值 function getParamString(paraPart,name) { var reg = new RegExp("(^|&amp;)" + name + "=([^&amp;]*)(&amp;|)"); var r = paraPart.substr(1).match(reg); if (r != null) return decodeURI(r[2]); return null; } function getParamFromUrl(name){ var r = getParamString(window.location.search,name) return r } //使用: var playname=decodeURI(getParamFromUrl('playgame'))

前端html之前传递中文参数乱码

js
1 2 3 4 5 6 7 8 9 10 11 12 13 14
我的开源 服务器倒计时 RSS 开始使用
cuijianzhe - 来自邯郸社畜的呐喊

红笺小字,说尽平生意。
鸿雁在云鱼在水,惆怅此情难寄。
——晏殊· 《清平乐》

241 文章
0 浏览     3 当前访客
© 2023 邯城往事 冀ICP备19005901号