哈喽哈喽你们猴,我是把代码写成bug的大头菜。公众号:大头菜技术(bigheadit)。原创不易,但欢迎转载。
最近这个星期。主要两件事儿:java
工做遇到的bug和总结
最近这两周,由于作了4个需求,都是关于黑白名单的。spring
因而我就打算,把这些黑白名单的需求,好比有关于C端用户的白名单,C端用户的黑名单,B端用户的白名单,B端用户的黑名单,我打算直接抽象一点,把4个需求抽象整合为一个需求。每一个黑白名单需求:都有增长黑白名单,删除黑白名单,查询黑白名单三种不一样的接口。tomcat
由于以前,已经有C端用户的白名单了。可是对应的表的设计没有考虑好拓展性,无法兼容C端用户的黑名单等需求。所以须要从新设计表。并发
新表的设计关键字段:jvm
role:角色分布式
type:黑白名单微服务
status:数据状态工具
businessCode:业务线性能
从新设计后,表的可拓展性大大提升。但业务的复杂度和开发复杂度也大大提升。鱼和熊掌不可兼得嘛。正常!优化
其实,把4个需求,抽象合并为一个需求,是下降了开发成本的,也对业务作了比较好的抽象,能够为之后其余相似的需求,好比:新增一条业务线D的白名单。
这样子,其实就是,在枚举上增长多一个枚举。在接口入参上,改变一下参数值便可。核心代码,几乎不用变。
若是考虑某些须要定制化的黑白名单。咱们采用策略工厂模式便可。这样子,代码的可读性大大提升,同时也知足开闭原则。
bug的潜在
由于涉及到表的从新设计,所以旧表的数据,也须要作同步迁移。数据迁移,这种写一下SQL语句就好。没什么特别的。
关键点:我忘了谁在使用旧表。
就是哪些接口调用了获取旧表的数据。当时,的确忘了这茬,也没作兼容。所以,bug就来了。
此次,也真算是,把代码写成bug了哈哈哈哈。
影响的范围:调用了访问旧表数据的接口。
对于此次bug的影响,我作了一些总结点
- 涉及到表数据迁移时,须要考虑兼容性,包括读和写,只要漏掉其中一个,bug确定就会有
- 若是真的实现,无法兼容原来的接口,这个时候,最好在大群里,广播通知一下各个调用方,好让他们尽快切换接口。
- 在分布式项目中,其实有一个痛点:就是接口不知道被哪一个微服务调用了。好比:服务A的A接口,被服务B的B接口调用了。可是由于这是2个不一样微服务,无法找对应的调用链。我目前也没找到好的办法来解决微服务的调用链问题。
从新梳理JVM的基础知识
最近从新梳理了一下JVM的基础知识。相关笔记以下:
- Q:咱们平时写的JAVA代码是怎么运行起来的
A:
- 一、把.java代码编译为.class代码
- 二、类加载器把.class代码加载到jvm中,是字节码执行引擎按需加载的,不是一次性加载所有.class代码
- 三、字节码执行引擎执行.class代码
- Q:既然.java代码能编译成.class代码后运行,那么确定也能够把.class代码反编译为.java代码。若是这样子的话,黑客拿到.class代码后,就能够经过反编译拿到核心.java代码。对于这个问题,应该怎么解决。
A:
- 一、代码混淆工具
- 二、能够自定义类加载器。而后用公钥和私钥作加密。
- Q:JVM是什么?
- A:JVM本质上也是一个程序,负责运行java编译好的class代码
- Q:JVM跟咱们平时运行的机器上的系统有什么区别?
- A:JVM具备跨平台。系统不具有跨平台。
- Q:类加载器的概念
- A:把编译好的class文件按需加载到JVMzhong
- Q:什么是字节码执行引擎
- A:针对加载进内存的class代码进行运行
- Q:类加载的流程
A:
- 一、JVM通常会在使用到具体某个类时,才会去加载对应的类。按需加载
- 二、加载到JVM后,须要对class代码进行语法验证操做
- 三、验证经过后,须要对类分配空间,对类变量分配空间,而且赋予默认值。
- 四、解析,就是符号引用替换为直接引用,说了等于没说。这个阶段,对咱们java开发没多大用处。跳过吧
- Q:何时会初始化一个类?
- A:new 类()的实例化的对象的时候,就会触发从加载到初始化的全过程。若是是包含main方法的类,必须启动时,就立马对类进行初始化。若是这个类还有父类,且父类还没被加载和初始化,这时候,须要先加载和初始化其父类,完成父类的初始化后,再回去初始化本身。
- Q:为何不把lib/ext的jar一块儿放在启动类加载器中一块儿加载?
A:
- 一、为了区分同名类
- 二、容许你再一个jvm里运行不一样的应用程序
- 三、对不一样的类库进行增强。
- Q:线程、java虚拟机栈、栈帧、局部变量、方法的关系
A:
- 一个线程,有一个java虚拟机栈。
- 一个线程,有一个程序计数器
- 一个java虚拟机栈,有多个栈帧
- 一个线程,每访问一个方法,就建立一个栈帧。
- 一个栈帧,有多个局部变量。
- Q:spring boot中怎么设置JVM参数?
- A:启动的时候设置
- Q:tomcat 中怎么设置JVM参数?
- A:catalina.sh 文件配置参数
- Q:系统并发量大时,系统会变慢,进而致使什么?
- A:系统并发量大的时候,会有一些请求特别慢,进而引用着新生代的对象,可是GC时没法回收,由于还被引用着。屡次minor gc后,特别慢的请求对应的对象,会进入老年代。进而很快把老年代填满,进而致使频繁的Full GC。