自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入理解MySQL系列-成神

MVCC 是通过在每一行的后面增加版本号,一个是创建版本号,一个是删除版本号,每一个事务创建时版本号都会自动加1 ,如果事务新增了一行,那么这行的创建版本号就是当前事务的事务版本号,如果事务删除一个行,就会在这个行的删除版本号上改成自己的事务版本号,如果更新一行,则会在表上新增一行,然后创建版本号是当前事务版本号,然后原来的行的删除版本号对应当前事务的版本号。让事务做出的修改行为记录到磁盘上的事务日志上,而真正的修改数据的行为,再缓存中执行,等待操作系统把缓存中的内容慢慢刷回磁盘。对另一个事务是不可见的。

2023-08-20 23:20:57 76 1

原创 深入理解计算机网络-HTTP铸剑

ssl 采用公开密钥加密技术 ,即由一个第三方数字认证机构颁发的证书给服务器方,这个证书表名公开密钥是对应的服务器的公开密钥,然后服务器将这个公开密钥发给客户端,客户端可以根据这个公开密钥的认证证书,利用数字认证机构的公开密钥进行验证,如果验证成功,客户端则可以认为这个服务器是真实有效的,服务器的公开密钥是值得信赖的。由于 一次请求中可能请求很多资源,每次请求都要断开重连,因此http1.1后默认所有的连接都是持久连接,一次将所有的请求全部传输完在断开连接,不会传输一个图片就断开连接,在申请连接传输。

2023-08-20 23:17:40 59 1

原创 深入理解计算机网络系列-计时器系列

这个定时器主要用在服务器端,当客户端与服务器端建立好TCP连接后,如果这时客户端挂掉了,那么服务器端不可能一直等客户端发送,服务器端每收到一个报文端,就重置保活定时器,通常为2小时如果两个小时都没有收到,服务器端会给客户端发送探测报文每75秒发一次,共发10次,如果10次都没有收到客户端的响应,就断开连接。用来计算TCP报文段超时时间的,当发送一个报文段,就开启重传定时器,在重传定时器到时间之前,如果收到确认的报文段就不用重新发送。

2023-08-20 23:16:32 122 1

原创 深入理解计算机网络系列- 3次握手4次挥手铸剑

前两次握手是必然的第三次握手是因为,如果没有第三次握手,如果这时网络拥挤,第一次客户端发送的TCP包没有到达服务器端,然后超时后又发送了一个TCP包,然后正常建立连接,正常发送数据,然后正常释放,释放后 发送的第一个TCP包被送到了服务器端,但是因为是失效的,服务器并不知道还会发送确认,建立连接,而客户端并没有数据要发送,服务器端只能一直等待下去。第三次 服务器端将发送完的数据发完后 ,发送一个FIn = 1 ACK = 1 seq = w ack = u+1 的数据包,

2023-08-15 05:09:04 30

原创 深入理解计算机网络-TCP-滑动窗口铸剑

发送方收到确认包中表名的窗口大小,来确定发送多大的数据包给接收方 如果接收窗口为0的大小的数据包,就停止发送数据包,发送方在没有收到确认包之前可以连续发送多个数据包,凡是发送出去的没有收到确认的包都要被保存起来,为了超时重发。发送发将要发送的数据缓存起来,每次只发送一部分数据给接收方,发送方收到确认报文后才继续发送数据包,另外,Nagle算法还规定,当发送缓存中的数据已达到发送窗口大小的一半或已达到报文段的MSS值时,就立即发送一个报文段。窗口左边沿向右边沿靠近,这种情况发生在数据被发送后收到确认时;

2023-08-15 05:07:23 61

原创 深入理解计算机网络-铸剑

如果在同一个子网络,发送方会发送自己的ip地址和对方的ip地址,自己的MAC地址 因为不知道对方的MAC地址所以对方的MAC地址设为FF.FF.FF.FF.FF.FF.FF表示这是一个广播地址,所有子网络内的设备都能收到,然后收到的设备会进行ip地址比较,如果二者相同,表示是发给自己的,然后发送回一个数据包 记录自己的MAC地址。传输层主要是建立在端口上的,一台计算机上有很多程序,两个计算机靠ip地址和MAC地址就可以交流,可是计算机中有很多程序,是如何判断数据包是哪个程序的,因此引入了传输层。

2023-08-15 05:06:05 77

原创 深刻理解高效并发-java成神之路

修改计算缓存中的数据后,在由缓存写回到主内存中。在没有竞争的情况下,不会采用monitor来进行加锁,而是采取轻量级锁,在线程的栈中创建一个锁记录,锁记录来cas交换对象头的markword,并且改变对象头的状态位,改成轻量锁的,如果此时来一个竞争的线程,则会把轻量级锁升级成重量级锁,就是在自旋锁的过程中,如果一个锁总是在自旋的时候获取不到,那么他在下次获取不到时可能不会自旋或者自旋次数减少,直接进入阻塞,又或者一个锁每次自旋都能获取到,那么在下次获取锁时,可以自旋次数多一些,增加自旋次数。

2023-08-15 04:59:04 39

原创 深入理解并发编程系列-juc的成神之路

阻塞式同步器工具, 内部采用state状态位来代表是否上锁,0没锁 其他表示上锁,子类需要定义如何维护这个状态位虽然其内部是用cas来改变状态位的,但是当改变失败时还是会被阻塞,内部使用park unpark阻塞的提供了等待队列也支持多个条件变量。

2023-08-15 04:56:12 39

原创 深入理解并发编程系列-volatile的作用

上述代码是有问题的如果第一个线程执行到instance = new object()这一步,在jvm指令上有两步,先调用object的构造方法,在赋值给instance 但是如果发生指令重排序 问题,就会导致先赋值后调用构造方法,如果赋值后还没调用构造方法,第二个线程就进入了外层的判断语句,发现instance!因此当main线程对内存中的数据改写后,thread线程依然读到的是缓存中的数据,导致没办法退出循环。由于编译器优化,jvm会对多次从内存中读到的数据加载到缓存中,下次读取会直接从缓存中读取。

2023-08-15 04:53:49 23

原创 深入理解并发编程系列-管程-理解

在第二个锁的时候也会进行交换操作,但是会失败,所以他的那个锁记录就是null,当解除锁时,如果锁记录为null,就会去掉一个锁标记,如果不为null,代表最后一个锁了,所以会进行锁记录和markword交换。就是当线程一得到了锁时,线程二在获取锁时,肯定获取不到,但是他不会立马进入阻塞,而是自旋多判断几次,如果几次都没获取到才会进入阻塞,但是如果获取到了,就减少了上下文切换带来的开销。如果一个对象局部变量,在线程中被使用,且没有被外面使用,则在线程中的锁会被jit编译器视为没有,叫 逃逸分析。

2023-08-15 04:52:09 16

原创 深入理解并发编程系列-线程-成神之路

当一个线程的cpu时间片被用完后需要保存这个线程的执行状态和数据。其他线程可以调用interrupt方法打断sleep中的线程,并不会改变其interrupt标记,被打断的线程会抛出interruptException异常。如果想再次把打断标记设置为假,那么我们可以调用Thread.interrupted()这个方法会返回当前打断标记,并且把打断标记设置为假。线程都有一个打断标记,表示这个线程是否被打断过。正在运行,当cpu时间片用完,进入可运行状态,等待下一次cpu分配,会导致线程上下文切换。

2023-08-15 04:47:50 23

原创 虚拟机性能监控和故障处理工具

主要有3个JHSDBVisualVM 在jdk6中首次发布曾经是jdk主要的分析工具,后来被单独分离出来,成为一个开源项目。需要下载插件,值得提的是 BTrace技术,在不修改源码的基础上,增加一些打印的代码。JMC(java mission control)主要是使用jmc中的jfr飞行记录仪 这个功能如果是商用的情况是收费的。

2023-08-15 04:44:11 74

原创 深入理解jvm系列-类加载机制的深入解析

双亲委派模型的工作原理是,如果一个类加载器需要加载某一个类,他会先把符号引用教给自己的父加载器,如果父加载器没办法加载,在找父加载器,如果还不能则返回给自己加载.这就保证了一个类的唯一性,因为越基础的类就越是上层加载器加载,这样object类永远都只有一个,启动类加载器, 用于加载java_home/lib目录的内容,主要是一些基础的类,这个类加载器是用c++写的是虚拟机的一部分无法得到他的名字,只能使用null代替,如果用户想把类加载给这个类加载加载的话,就得把类加载器值赋值为null。

2023-08-15 04:41:32 24

原创 深入理解jvm系列-垃圾回收算法详解,垃圾收集器。

事实上在hotspot中的oopmap并不是不变的,有一些指令会使oopmap改变,而内存不会为每一条指令都生成oopmap只有特定的指令才会生成oopmap,这些特定的地方成为安全点,程序只有在安全点时才能够进行垃圾收集,所以安全点的选取不能特别密集,不然就会使程序吞吐量下降,也不能太过稀疏,就会导致内存中有大量垃圾,而对象无法分配的问题,而是否能让程序长时间执行就是安全点选取的一个条件,比如方法的调用,异常跳转,循环跳转等,也就相当于把黑色节点变成灰色,等会第二次标记时重新搜索这个灰色节点以下的节点。

2023-08-03 21:02:40 29

原创 深入理解jvm-outofmemory

栈中主要存放的是栈帧,而栈帧的大小是在编译器就确定的,所以我们只需要不停的创建栈帧添加到栈中就会溢出,两种方式一种是增加栈帧的数量,不停的递归调用方法, 第二种是增加栈帧的大小,就是在方法中定义大量的变量,这样栈帧就大,也会导致溢出.第一种对象引用变量就是在对象中定义一个引用自己的变量的数量,有人引用自己就加1,少一个引用就减一,但是这种方式有一个缺点就是无法回收循环引用,因此很少有虚拟机是这样判断的。这类引用是永远不会被回收的。引用还被分为强引用,软引用, 弱引用,虚引用,引用强度依次减弱。

2023-08-03 20:46:45 27

原创 深入理解jvm系列-java内存区域深入解析。

java虚拟机栈是线程独有的,里面存的是栈帧,每一个栈帧是在编译时就确定栈帧大小的.栈帧里存的主要是局部变量表,局部变量表里存的是变量long和double占用两个slot,其余的基础类型占用一个slot,还会存对象引用(reference类型),并不是对象本身,可能是对象地址或者是句柄.本地方法栈和虚拟机栈发挥的作用非常相似.区别只是在于本地方法栈是为了Java虚拟机执行本地方法(本地方法就是用其他代码写的方法,比如c++代码)而虚拟机栈是为了执行java方法。是线程独有的,一个线程一个。

2023-08-01 21:51:16 37 1

空空如也

空空如也

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

TA关注的人

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