![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
javaSE
阿猫阿狗学编程
这个作者很懒,什么都没留下…
展开
-
从TCP到HTTPS原理之HTTP与HTTPS(二)
http是基于tcp协议的应用协议,意思就是通过tcp建立连接后后面发送的消息是http格式的, 已打电话为例, 基于电话线我们可以用汉语,英语,日语沟通。同样的基于tcp协议我们可以用https,fps,等进行沟通。https就是http+ssl。就是安全版的http。HTTP直接看抓包结果可以看到发送什么消息都可以直接明文看到,响应消息也可以直接看到建立tcp连接后直接发送消息没有安全性。HTTPShttps建立tcp连接后还有一套加密解密过程先看下抓包可以看到同样的请求多了很原创 2021-12-11 18:44:36 · 2455 阅读 · 1 评论 -
从TCP到HTTPS原理之TCP(一)
抓包来理解tcp协议原创 2021-12-11 18:22:55 · 2245 阅读 · 1 评论 -
redis主从复制原理
Redis主从同步有2种,SYNC和PSYNC, PSYNC是优化版的SYNC,2.8版本才有,废话不多说直接看图!SYNC的原理SYNC有缺点,就是掉线后的同步,需要进行全量同步,没有增量同步功能。SYNC缺点1.生成RDB文件,将耗费主服务器CPU、内存和磁盘I/O资源2.RDB文件发送给从服务器,耗费主网络资源,对主响应命令请求的时间产生影响。3.从服务器载入RDB文件,在载入期间,因为阻塞而没办法处理命令请求。4.当掉线后即便至少了很少数据也需要全量同步。因为有以上缺陷所以原创 2021-07-30 00:13:27 · 125 阅读 · 0 评论 -
多线程hashmap死循环分析
这边分析的是JDK1.7版本的hashmap核心代码是这 void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { while(null != e) { Entry<K,V> next = e.next;原创 2021-07-26 23:48:55 · 132 阅读 · 0 评论 -
三张图片理清JVM内存布局和GC算法
内存布局以及控制他们的命令GC算法原创 2021-02-17 20:59:50 · 114 阅读 · 0 评论 -
类的加载机制
类的生命周期包括加载,验证,准备,解析,初始化,使用,卸载。加载:把.class文件加载进内存,生产class对象。验证:检验class文件是否合规,比如魔数是不是cafebaby。原创 2020-09-02 11:23:06 · 89 阅读 · 0 评论 -
一张图片看懂Java对象头以及组成
需要特别注意当一个对象计算过hashcode他就无法进入偏向锁。当一个对象是偏向锁时我们计算hashcode它会变成重量级锁。原创 2021-02-16 19:00:02 · 221 阅读 · 2 评论 -
三张图片搞懂分布式事务常用方案
两阶段提交(XA协议)TCC方案最终一致性原创 2020-11-19 10:46:31 · 116 阅读 · 0 评论 -
一张图片搞懂java的引用类型以及ThreadLocal为什么会导致内存泄露
java4种类型引用强,软,弱,虚。强引用:我们平常的引用都是这种类型,gc后,即便内存不够也不会被回收。软引用:用法SoftReference<类> sr; sr.get();在gc后如果内存还是不够便会回收软引用。一般我们的缓存value可以用软引用保证。弱引用:WeakReference<类> wr;wr.get();不管内存够不够,每次gc都会回收。虚引用:这个引用跟前面3个不太像,PhantomReference<类> pr;ReferenceQueue原创 2020-09-02 16:46:09 · 158 阅读 · 0 评论 -
springboot启动流程
mai方法实例化应用上下文初始化类实例化应用事件监听(spring实现java事件接口),加载应用运行监听类,通过start通知所有应用运行监听实现类。创建和配置当前使用的环境输出banner是否是web容器一系列故障分析类初始化应用上下文调用它的refresh完成ioc,并调用里面实现了各种aware接口的bean的方法。运行命令行运行类和应用运行类spring应用运行监听类的finish方法...原创 2020-08-28 11:25:33 · 77 阅读 · 0 评论 -
一张图看懂springboot自动装配原理
自动就是我们在引入第三方依赖时可以自动装载这些依赖包的bean,如果用原始的xml我们需要一大堆第三方的类.boot会去读取每个依赖工程下面的META-INF/spring.factories(约定俗成的目录)里面指定的类,将他们装载成bean。装配一般就是装载配置类相关的,比如默认的json解析器,数据库配置等,...原创 2020-11-01 21:16:37 · 277 阅读 · 1 评论 -
java转c++需要注意的几个点
1. 左值就是可以改变数据的变量,可以出现在左边或右边,出现在右边就变成右值了。 右值只能出现在右边,consts即不是左值也不是右值。2. 内联函数就是短而小的函数,在函数调用的地方直接替换成代码,减少函数调用成本。函数声名成inline int max(int a,int b),或者直接宏定义#define MAX(a,b) ((a)>(b)?(a):(b)).3. typedef相当于对数据类型取别名,typedef int INT; INT a就相当于int a;4. extern就原创 2020-09-16 23:07:09 · 570 阅读 · 0 评论 -
aop几个概念理解
通知:前置通知,后置通知,异常通知等。连接点:是切方法还是切异常。切点:切什么样的方法(异常)切面:通知和切点所在的类。织入:创建目标代理的过程。原创 2020-09-04 16:28:45 · 136 阅读 · 0 评论 -
HTTPS之非对称加密
对称加密即加密和解密密钥是同一个。比如我发给 good给你,然后我的密钥是1,算法是每个字母+1,我发给你的信息变成hppe。你收到信息后密钥也是1,算法就是字母-1,解密后变成good。 问题是我们要怎么沟通密钥和加密解密算法呢,可以当面给你比较安全,但是麻烦,如果直接网上发消息很可能被其他人窃听了,为了解决这个问题就出现了非对称加密,RSA是他的一个实现。非对称加密有以下特点:有两把钥匙公钥和私钥,公钥就是可以公开的,私钥保留在自己这。公钥加密的东西私钥可以解密,私钥加密的东西公钥可以解密(涉及到数原创 2020-09-04 20:52:45 · 415 阅读 · 0 评论 -
SpringBoot常用技巧
如何扫描这个启动类包外的包?@ComponentScan(basePackages = {“com”}) com就是我们要扫描的包如果一个接口有两个实现类在使用@Autowired注入的时候改怎么做?要注入的成员变量名跟你要的beanName一样.1.@AutowiredAnimal cat;就会注入Cat了不会注入Dog.2.如果有Cat和Dog,优先注入Cat,就在Cat加@Primary@Primarypublic class Cat implement Animal {} 这..原创 2020-09-03 23:55:29 · 228 阅读 · 0 评论 -
redis持久化过程中可以对外服务吗
https://www.csdn.net/gather_2f/MtjaggzsNTE1MTYtYmxvZwO0O0OO0O0O.html持久化有两种方式:rdb和aof。rdb就是生成某个时间点快照,有异步bgsave和同步save,同步的话肯定不能对外服务了,异步是通过fork子进程完成的,需要注意的是,在异步的时候,数据可能发生变化,那redis是如何处理的呢?redis并不是直接复制一份进行复制,redis运用写时复制cow思想,即一开始redis和子进程都指向同一个数据,当某个key改变时red原创 2020-09-01 19:10:25 · 561 阅读 · 0 评论 -
java中级程序员的几个面试题
1.G1有哪几种GC?什么时候出发full gc?参考这篇G1旨在取代CMS,一个特点就是可以指定STW时间,参数是-xx:MaxGCPauseMillis=100。G1有两种回收算法:年轻代是复制算法,老年代是标记清除算法。G1采用分区思路,分区有大有小,需要注意的是年轻代,老年代并不是物理上完全区分的,而是在分区里面任意占用。G1有两种GC,Young GC和oldGC,当所有eden分区满了就会进行Young GC,存活下来的都拷贝到Survivor区,并根据年龄晋升到老年代(这个特点跟具原创 2020-08-31 22:39:08 · 1335 阅读 · 0 评论 -
RPC与HTTP对比
RPC是远程服务调用,一般是服务方把消费者jar包给你,然后使用这个jar的代理相关方法,会返回一个接口给你,后面你要什么服务,就跟直接调用这个的方法即可,jar会帮你处理的。HTTP是没什么好说的,大家都懂。RPC跟HTTP都是通过TCP进行通讯,然后RPC一般是自己定义一套传输协议,在传送数据的时候涉及到序列化,所以不同的框架是无法进行兼容的,因为数据格式不同就无法解析了。 HTTP数据一般都是用json进行传送,大家格式都一样,所以不同的编程语言,框架都是兼容的,都能识别。RPC一个优点就是知道原创 2020-08-30 17:14:37 · 1037 阅读 · 0 评论 -
spi与双亲委派
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码原创 2020-08-28 00:00:31 · 257 阅读 · 0 评论 -
小白入门springcloud组件概念
微服务其实就是讲原来一个大服务拆分成多个小服务分成多个应用,比如原来用户积分,跟用户订单在一个java项目中,后来代码膨胀不好维护了,便拆了两个java项目。原来一个项目调用是直接用方法调用,现在是两个不同的jar包了不能直接调用了,要调用有两种实现方法,意思是RPC调用如dubbo,一种是http调用如springcloud。先讲下springcloud。要调用对方至少得知道对方地址是什么,所以有Eureka注册中心,每个jar报将自己有哪些服务,以及地址是什么注册到Eureka,jar包通过读取eur原创 2020-08-25 20:37:30 · 113 阅读 · 0 评论 -
java静态代理和动态代理基础知识
静态代理:就是自己实现代理类,有这个代理类源码,主要思路就是代理类里面有个被代理类的成员变量,并且需要跟它实现同一个接口,这样才能知道需要代理哪些方法,然后在对应的方法下进行编写。客户端在使用的时候是接触到代理类,调用代理类的方法。然而,代理的应用一般是第三方应用编写代理类,由开发人员实现被代理类,如果是使用静态代理,这显然是不能实现的,所以真正广泛应用的是动态代理。动态代理:前面说了需要实现同一个接口才能知道有哪些方法,但其实我们可以直接传方法进来啊,然后调用的时候直接调用这个方法对象即可,即运用反射原创 2020-08-24 23:42:15 · 99 阅读 · 0 评论 -
jvm内存分布基础知识
jvm分成5个部分:虚拟机栈:存放调用java方法的相关数据,如局部变量,返回地址。本地方法栈:存放调用本地方法的相关数据,如局部变量,返回地址。程序计数器:存放当前线程运行到哪一行。堆:存放对象的。只有这个区域才有CG。直接内存:NIO中的DirectBuffer,直接使用的物理内存,即大小受本机总内存限制。方法区:存放类信息,静态变量,常量等。堆是垃圾回收的地方,又分成2个部分年轻代和老年代。年轻代又分成2个部分1个Eden区和2个survivor区。 新建的对象会创建在eden区,然后原创 2020-08-23 20:44:47 · 149 阅读 · 0 评论 -
java进程cpu100%如何定位到具体的代码
查找cpu占有率的PID。 输入命令 top -c ,然后按p(按cpu使用率排序)找到排名第一的java进程,比如它的pid 是 pid1.查看这个pid下哪个线程占用率。top -Hp pid1 ,按p 找到排名第一的线程id,比如是 pid2导出线程运行情况 , jstack -l pid1 > stack.infocat log.log |grep ‘16进制的 pid2’ -C 8。总结:top -c ,ptop -Hp pid1jstack -l pid1 &.原创 2020-08-23 15:46:17 · 289 阅读 · 0 评论 -
synchronized底层原理简单说明
synchronized本质是获取一个独占可重入的对象。java对象由三部分组成:对象头,实例数据,对齐填充。 其中对象头记录了这个对象所指向的C++monitor对象,这个monitor记录了哪个线程持有锁,以及一些阻塞队列等。也就是说如果 synchronized(lock) lock对象的对象头有个指针 指向了 monitor,这个是一一对应的关系。synchronized底层指令是1个monitorenter和2个monitorexit。 是因为除了正常退出,还有出现异常也要退出,所以有2个退原创 2020-08-22 21:37:34 · 296 阅读 · 0 评论 -
java偏向锁以及它的升级
先科普一下:我们经常说悲观锁,乐观锁,公平锁,非公平锁,读写锁等等,这些概念并不是对立的关系,而是从不同角度看待对锁的分类,比如synchronized,既是非公平锁又是可重入锁。偏向锁的出现的背景:jvm作者研究发现,大部分情况锁不仅不存在竞争,而且总是由同一个线程获得。为了减少获取的代价,引入了偏向锁。获取偏向锁:线程1进入同步,在锁的对象的对象头(理解成对象的信息表)有个是否是偏向锁,以及偏向的线程id。如果偏向的线程id不是自己,线程1就用CAS操作替换成自己,成功就获取到锁了,退出同步块的时候原创 2020-08-15 00:37:15 · 227 阅读 · 0 评论 -
一张图看懂spring生命周期
实例化,就是进行new。进行bean配置。就是调用成员变量的set方法。BeanNameAware接口的setBeanName(String )方法,入参就是当前Bean的id值。BeanFactoryAware接口的setBeanFactory(BeanFactory)入参是Spring工厂自身,可以用来获取其他bean。ApplicationContextAware接口的setApplicationContext(ApplicationContext)方法,入参是spring上下文功能比Bea.原创 2020-08-05 23:31:32 · 194 阅读 · 0 评论 -
萌新也能看得懂之spring如何解决循环依赖
循环依赖指的是 类A引用类B, 类B又引用类A。public class LoopDependcy { public static void main(String[] args) { /* 前提知识:spring的生命周期有 1.bean实例化(new 出这个对象) 2.bean属性注入(调用成员变量的set方法完成赋值) 其他步骤不涉及循环依赖跟这边就不讲了 */ //一,如果循环依赖是通过构造注入的 A(B b)原创 2020-08-04 21:29:46 · 107 阅读 · 0 评论 -
如何进行消息队列的技术选型?
如何进行消息队列的技术选型?为什么要用消息队列解耦异步削峰消息队列的优点和缺点架构中引入mq可能存在的缺陷kafka、activeMq...转载 2020-04-14 20:22:39 · 80 阅读 · 0 评论 -
面试官:讲讲CAS是什么,为什么他不用synchronized也能实现线程安全。两张图片让你理解源码
CAS意思是一个变量主存中的值跟线程期望的值一样,这个线程才回真正去修改它。java中Atomic+包装类,如AtomicInteger是其具体实现,1.一张图片让你理解源码2.内存示意图...原创 2020-02-29 16:10:35 · 274 阅读 · 0 评论 -
两种图片理解什么是可见性,volatile有什么用。
1.先来做个实验public class Sync { static boolean isRun = true; static void run() { while (isRun) { } System.out.println("结束"); } public static void main(String[] arg...原创 2020-02-28 23:57:50 · 218 阅读 · 0 评论 -
三张图片理解tcp协议三次握手内在逻辑
TPC连接需要三次握手,很多人不能理解为什么是三次,下面请看图~理论上只需要两次握手就可以了实际上会有意外情况解决办法就是三次握手原创 2018-11-09 22:30:19 · 235 阅读 · 1 评论