关于java:2021040420210409技术周报

5次阅读

共计 2788 个字符,预计需要花费 7 分钟才能阅读完成。

哈喽哈喽大家猴,我是把代码写成 bug 的大头菜。公众号:大头菜技术(bigheadit)。原创不易,但欢送转载。

最近这个星期。次要两件事儿:

  • 工作遇到的 bug 和总结
  • 从新梳理 JVM 的基础知识

工作遇到的 bug 和总结

最近这两周,因为做了 4 个需要,都是对于黑白名单的。

于是我就打算,把这些黑白名单的需要,比方有对于 C 端用户的白名单,C 端用户的黑名单,B 端用户的白名单,B 端用户的黑名单,我打算间接形象一点,把 4 个需要形象整合为一个需要。每个黑白名单需要:都有减少黑白名单,删除黑白名单,查问黑白名单三种不同的接口。

因为之前,曾经有 C 端用户的白名单了。然而对应的表的设计没有思考好拓展性,没法兼容 C 端用户的黑名单等需要。因而须要从新设计表。

新表的设计关键字段:

  • role: 角色

    • 1:C 端用户
    • 2:B 端用户
  • type: 黑白名单

    • 1: 白名单
    • 2: 黑名单
  • status: 数据状态

    • 1: 失效
    • 2: 生效
  • businessCode: 业务线

    • 1: 电商业务线
    • 2: 外卖业务线
    • 3: 物流业务线

从新设计后,表的可拓展性大大提高。但业务的复杂度和开发复杂度也大大提高。鱼和熊掌不可兼得嘛。失常!

其实,把 4 个需要,形象合并为一个需要,是升高了开发成本的,也对业务做了比拟好的形象,能够为当前其余相似的需要,比方:新增一条业务线 D 的白名单。

这样子,其实就是,在枚举上减少多一个枚举。在接口入参上,扭转一下参数值即可。外围代码,简直不必变。

如果思考某些须要定制化的黑白名单。咱们采纳策略工厂模式即可。这样子,代码的可读性大大提高,同时也满足开闭准则。

bug 的潜在

因为波及到表的从新设计,因而旧表的数据,也须要做同步迁徙。数据迁徙,这种写一下 SQL 语句就好。没什么特地的。

关键点:我忘了谁在应用旧表。

就是哪些接口调用了获取旧表的数据。过后,确实忘了这茬,也没做兼容。因而,bug 就来了。

这次,也真算是,把代码写成 bug 了哈哈哈哈。

影响的范畴:调用了拜访旧表数据的接口。

对于这次 bug 的影响,我做了一些总结点

  • 波及到表数据迁徙时,须要思考兼容性,包含读和写,只有漏掉其中一个,bug 必定就会有
  • 如果真的实现,没法兼容原来的接口,这个时候,最好在大群里,播送告诉一下各个调用方,好让他们尽快切换接口。
  • 在分布式我的项目中,其实有一个痛点:就是接口不晓得被哪个微服务调用了。比方:服务 A 的 A 接口,被服务 B 的 B 接口调用了。然而因为这是 2 个不同微服务,没法找对应的调用链。我目前也没找到好的方法来解决微服务的调用链问题。

从新梳理 JVM 的基础知识

最近从新梳理了一下 JVM 的基础知识。相干笔记如下:

  • Q: 咱们平时写的 JAVA 代码是怎么运行起来的
  • A:

    • 1、把.java 代码编译为.class 代码
    • 2、类加载器把.class 代码加载到 jvm 中,是字节码执行引擎按需加载的,不是一次性加载全副.class 代码
    • 3、字节码执行引擎执行.class 代码
  • Q: 既然.java 代码能编译成.class 代码后运行,那么必定也能够把.class 代码反编译为.java 代码。如果这样子的话,黑客拿到.class 代码后,就能够通过反编译拿到外围.java 代码。对于这个问题,应该怎么解决。
  • A:

    • 1、代码混同工具
    • 2、能够自定义类加载器。而后用公钥和私钥做加密。
  • Q:JVM 是什么?
  • A:JVM 实质上也是一个程序,负责运行 java 编译好的 class 代码
  • Q:JVM 跟咱们平时运行的机器上的零碎有什么区别?
  • A:JVM 具备跨平台。零碎不具备跨平台。
  • Q: 类加载器的概念
  • A:把编译好的 class 文件按需加载到 JVMzhong
  • Q: 什么是字节码执行引擎
  • A:针对加载进内存的 class 代码进行运行
  • Q: 类加载的流程
  • A:

    • 1、JVM 个别会在应用到具体某个类时,才会去加载对应的类。按需加载
    • 2、加载到 JVM 后,须要对 class 代码进行语法验证操作
    • 3、验证通过后,须要对类调配空间,对类变量调配空间,并且赋予默认值。
    • 4、解析,就是符号援用替换为间接援用,说了等于没说。这个阶段,对咱们 java 开发没多大用处。跳过吧
  • Q:什么时候会初始化一个类?
  • A:new 类 () 的实例化的对象的时候,就会触发从加载到初始化的全过程。如果是蕴含 main 办法的类,必须启动时,就立马对类进行初始化。如果这个类还有父类,且父类还没被加载和初始化,这时候,须要先加载和初始化其父类,实现父类的初始化后,再回去初始化本人。
  • Q:为什么不把 lib/ext 的 jar 一起放在启动类加载器中一起加载?
  • A:

    • 1、为了辨别同名类
    • 2、容许你再一个 jvm 里运行不同的应用程序
    • 3、对不同的类库进行增强。
  • Q:线程、java 虚拟机栈、栈帧、局部变量、办法的关系
  • A:

    • 一个线程,有一个 java 虚拟机栈。
    • 一个线程,有一个程序计数器
    • 一个 java 虚拟机栈,有多个栈帧
    • 一个线程,每拜访一个办法,就创立一个栈帧。
    • 一个栈帧,有多个局部变量。
  • Q:spring boot 中怎么设置 JVM 参数?
  • A:启动的时候设置
  • Q:tomcat 中怎么设置 JVM 参数?
  • A:catalina.sh 文件配置参数
  • Q:零碎并发量大时,零碎会变慢,进而导致什么?
  • A:零碎并发量大的时候,会有一些申请特地慢,进而援用着新生代的对象,然而 GC 时无奈回收,因为还被援用着。屡次 minor gc 后,特地慢的申请对应的对象,会进入老年代。进而很快把老年代填满,进而导致频繁的 Full GC。
  • Q:什么状况 JVM 内存中的一个对象会被回收?
  • A:GC Root。比方局部变量和动态变量。此外,还分强援用,软援用。虚援用。

    • 强援用,只有被 GC Root 援用,就肯定不会被回收。
    • 软援用,是在垃圾回收后,依然不够内存空间,才会被回收,不论是否被援用。
    • 虚援用,垃圾回收,就会被回收,不论是否被援用。
  • Q: 对象在新生代的调配?
  • A: 优先在 eden 区调配
  • Q: 什么时候会触发 Minor GC
  • A:eden 区满了。
  • Q: 触发 minor gc 的状况有:
  • A:

    • 1、新生代现有对象小于老年代残余内存,即老年代空间足以撑持可能降职的对象
    • 2、状况 1 不成立,查看设置了空间担保且担保胜利
  • 什么状况下 Minor GC 之前会提前触发 Full GC?
  • A:

    • 1、新生代的全副对象大小如果大于老年代的残余空间
    • 2、没有空间担保机制
    • 3、担保失败
  • Q: 什么状况下会间接触发 Minor GC
  • A:eden 区满了
  • Q:Minor GC 之后有哪几种状况对象会进入老年代
  • A:

    • 1、survivor 区不能包容 eden 区的存活对象
    • 2、动静年龄判断:survivor 区的同一年龄对象超过 survivior 空间的一半
  • Q: 优化零碎性能的思路?
  • A 外围思路:尽可能让对象不要过快进入老年代。缩小老年代的 full gc。尽可能让对象在新生代就被 GC 回收。
  • Q: 如何让对象不要过快进入老年代?
  • A:survivor 要有足够的空间。试想一下,如果 survivor 区,空间不够,对象就会间接进入老年代。即便够,然而超过 survivor 区的一半,也会因为动静年龄判断,而间接进入老年代。
正文完
 0