20210404-20210409技术周报

哈喽哈喽大家猴,我是把代码写成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区的一半,也会因为动态年龄判断,而直接进入老年代。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容

  • 1、java中==和equals和hashCode的区别 基本数据类型的==比较的值相等.类的==比较的内存的地址...
    Mr_Fly阅读 855评论 0 0
  • 1、java中==和equals和hashCode的区别 基本数据类型的==比较的值相等.类的==比较的内存的地址...
    快感的感知阅读 1,140评论 0 4
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,724评论 2 59
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,566评论 0 11