深入理解 ClassLoader

ClassLoader 源码初探

类加载器用于加载 Java 类到虚拟机中,其实现类 java.lang.ClassLoader 是一个抽象类,其职责是通过指定类的完全限定名 ( binary name ),找到或生成这个类对应的字节码,这些字节码中包含类的定义数据,通过字节码就可以构造出一个 java.lang.Class 对象。

每个 Class 对象都包含一个定义它的类加载器的引用,而数组的 Class 对象不是用类加载器创建的,而是在 Java 运行时根据需要自动创建的,如果调用数组的 Class 对象的 getClassLoader() 方法返回的类加载器与其元素类型的类加载器相同,如果数组元素是基本数据类,则没有类加载,返回空。比如:

// C为自定义类
C[] cs = new C[2];
// jdk.internal.loader.ClassLoaders$AppClassLoader@3d4eac69
System.out.println(cs.getClass().getClassLoader());

int[] is = new int[2];
// null
System.out.println(is.getClass().getClassLoader());
深入理解JVM类加载机制

Java 代码在编译过后,想要被运行和使用,经过的第一个步骤就是将编译后的字节码文件加载的虚拟机,那虚拟机是如何把字节码文件加载到虚拟机的呢,接下来以一系列实例对这一流程作简要分析与介绍。

类编译过程

Java 源码通过 JDK 自带的 Javac 编译器编译成 class 文件,我们把 class 文件中包含的代码称为字节码。但字节码并不能直接在计算机上运行,所以 JVM 需要将字节码翻译成机器码,其大致流程如下图所示。
Java类编译过程示意图
一般会把.java文件编译成.class文件的过程称为前端编译,其由 JDK 自带的 javac 工具完成。前端编译是一个非常复杂的过程,包含词法分析、注解处理、语义分析等,因此,代码中的大部分语法错误,在这个阶段就能够被识别出来。

编译后的字节码文件中主要包含常量池和方法表集合两个部分,可以通过 Javap 命令来查看,后面的文章也会详细的讲解。

接下来,JVM 会把 class 文件中的字节码加载到内存中,经过连接和初始化以后,类在调用执行的过程中,会继续把字节码翻译成机器码,这个翻译过程在 Hotspot 中有两种形式:

  • 解释执行:逐条将字节码翻译成机器码并执行
  • 即时编译:将一个方法中所包含的所有字节码编译出机器码后再执行

在起始阶段,JVM 中的字节码是由解释器(Interpreter)完成编译的,当虚拟机发现某个方法或代码块的运行特别频繁时,这些代码块就会被认定为热点代码。为了提高热点代码的执行效率,在运行时,JIT 会把这些代码编译成本地平台相关的机器码,并进行各层次的优化,然后保存到内存中,这一过程就被称为即时编译。

这种将两种编译方式混合执行的策略,在上图中被描述为“运行时编译”,也是 Hotspot 默认采用的策略。

非奋斗减肥:关于运动和减脂的一些小误区

最近一段时间想控制下体重,随手翻的健康类书籍比较多,在这本「非奋斗减肥」中确实收获到不少与常规认知有差异的知识。

Part ONE

首先,介绍几种日常生活中随处都能听到,但又说不明白的几种物质。

胰岛素

当我们摄入糖类食物时,食物中的糖开始被不同的酶分解,最终被小肠吸收后转化成为葡萄糖,通过血液输送到全身。血液中的葡萄糖转化为糖原后,会优先储存在肝脏和肌肉当中,但是肝脏和肌肉中储存糖原的空间十分有限。剩余的大量糖原就会进入脂肪细胞,转化成为脂肪储存在人体内,于是肥胖就形成了。

当血液中的葡萄糖升高时,胰腺就开始工作了。胰腺会分泌胰岛素,胰岛素的作用就是促进血液中的葡萄糖转移到细胞中,帮助调节血糖,保证血糖值维持在一定的安全水平。因此,你摄入的糖越多,胰腺就要分泌更多的胰岛素来调节血糖,那么就会有更多的糖原进入脂肪细胞中。更重要的是,如果血液中的胰岛素水平长期居高不下,那么细胞对胰岛素的敏感度就会降低,形成胰岛素抵抗

胰岛素抵抗,跟抗生素的耐药性是一样的道理,对于有胰岛素抵抗的人来说,同等剂量的胰岛素无法使原先血液中的糖原进入细胞,于是胰腺就需要分泌更多的胰岛素才能把血糖降下来。而胰岛素又是促进脂肪合成的激素,这些大量的胰岛素会使身体合成更多的脂肪,所以胰岛素抵抗是现代人日渐肥胖的主要原因之一。胰岛素抵抗最容易导致腹部脂肪堆积。如果你的腰围和臀围的比例大于 0.9,就有较大可能存在明显的胰岛素抵抗。

因此,胰岛素又被称为肥胖激素,想要把胰岛素控制在很低的水平,关键就是控制糖的摄入。

我要开始卷腹肌

年初下定了决心今年体重一定要掉到 110 斤,但从春节后就一直没怎么运动,饮食也没节制,体重相较与去年还涨了近 10 斤。眼看时间来到了 5 月,时间也快过半了,想想也该行动起来了。

我要开始卷腹肌Photo by bruce mars

在 B 站上找了个 练腹肌的课程,不仅能跟着练,还介绍了饮食的底层逻辑,甚至还推荐了食谱。正好最近也看了基本有关健康的书籍,结合自己的实际情况,定制了下面的食谱。

像速食鸡胸肉、荞麦面、面包这些东西,我先前吃得也不多,也不知道好不好吃,但暂且先吃着。

饮食原则

根据课程的内容,总结了几点我的饮食原则:

  • 规律进食,饿了才吃,不饿不吃
  • 避免 添加糖 的食物和饮料,常见的饮料、甜食、零食、罐头等都含有大量的添加糖
  • 避免油炸、油焖、干锅、红烫火锅、重口川菜等 多油 的食谱
  • 不吃猪蹄、五花肉、鸡皮、油炸薯片等 脂肪过高 的食物
  • 少吃腊肉、腌肉、话梅等 重盐 食物
  • 每天喝 2.5L-3L 水
  • 每周可以有 1 顿欺骗餐,跟同事聚会、朋友聚餐等,但大餐吃饱即可,不要吃撑
  • 减脂期饿是常态,如果每天睡前,没有微微的饥饿感,那么证明你今天吃太多了
M型社会:我们从哪儿开始?

三十年前,日本经济开始衰退,人民收入开始减少,年收入在600万日元以下的中低阶层,已经占了日本总人口的八成。原先占比八成的中产阶级,一大部分人落到中低阶层,一小部分人挤入富裕阶层。中产彻底解体,一个人要么是富人,要么是穷人,没有中间层,收入严重两极分化,这就是所谓的M型社会。

M型社会文章题图

中国在经历了三十年的高速发展之后,也不可避免的慢了下来。经历了这几年的经济不景气,谁也不知道我们会不会经历日本那种长期的经济衰退,但短期的衰退是不可避免了。那我们应该怎么办?也许这本书能给我们些启发。

聊聊回家过年那点事

从年三十到正月初七这八天是我过去一年过得最轻松的一周,这一周没有客户需求、没有业绩目标、没有技术难题、更没有不学习的罪恶感,真的是太爽了。

跟以往一样,腊月二十九在家大扫除,年三十为年夜饭从早忙到晚,初一逛逛街看看电影,初二我和老婆各回各家拜年走亲戚。我很喜欢回家走亲戚,也很喜欢和他们聊天,他们会告诉我过去一年身边发生的趣事,我也会跟他们说说我所看到的世界。这样毫无压力的聊天氛围,让我特别的放松。

过去几年,都是开车回家,堵怕了,今年坐火车回去,稍微轻松一点,火车上也发生了不少趣事。接下来就说说,过年回家的新体验。

笔记的方法

在电子书上划过很多线、在浏览器中裁剪过很多网页、在微信中也收藏过不少文章,如果这些能够算作笔记的话,我确实记录过不少东西。然并卵,这些文字于我而言有什么意义?也许只是在当时多了些情绪价值而已。因此,在阅读这本书以后,我重新开始审视记笔记这个动作。

笔记的方法

用自己的话来记笔记

记笔记的核心是用自己的话来记录。为什么?

首先,人的记忆有两种机制:存储和提取。研究表明,信息存入记忆越容易,提取就越困难;反之,存入记忆越困难,知识提取会更方便,这就是「必要难度理论」。用自己的话来记录,就是为了增加存储时的难度,以便未来遇到难题时,更有可能想起(提取)记过的笔记。

其次,记录和收集信息是有巨大区别的。大量收集的信息,很多时候并不会给我们太多帮助,因为我们遇到问题时,更习惯直接使用搜索引擎或AI。你可能会说,那我可以先去笔记中搜索呀。当然可以,但我想告诉你的时候,搜索没有加工过的笔记,跟搜索网页并没有太大的区别。

因此,记录并不那么重要,重要的是思考。只要用自己的话来复述或是总结,你一定会思考,这种倒逼自己思考的过程,才是记录的意义。

我在北京送快递:这个艰辛颠簸的世界

看多了网络上灯红酒绿的生活,读读「我在北京送快递」吧,作者胡安焉用类似于“流水账”的方式记录他在约十多年间干的近二十份工作,写下了这个艰辛颠簸的世界。

我对现实世界的反应有点迟钝,很多人会误以为这是乐观,觉得什么问题在我这儿都云淡风轻似的,但实际上可能是我对现实并没有那么多期待,甚至有点迟钝而已。在整个阅读过程中,其实我并没有那么感同身受,也没有那种窥探到另一个阶层生活的快感,尽管我并不认为我和快递员不在同一个阶层。

但作为一个社畜,同为社会的最底层,总还能找到些许共鸣。

我在北京送快递

我经历的2023年

新年第一天,坐在桌前,试着想回忆过去一年干了些什么,除了些许情绪,脑袋一片空白。

Photo by Morgan Sessions
Photo by Morgan Sessions

我们六个人的团队运营着一款B端产品,这一年,我们在研发、销售、客户成功方面都做了不少尝试,营收相较于22年并没有太大的提升,但付出的代价却是账上的现金消耗一空。这也意味着,24年我们必须要实现收支平衡,否则团队就要散了。当然这一年也不是完全没有收获,最大的收获就是知道哪些事我们做不了,哪些路我们走不通。最重要的是,仍然有小伙伴愿意继续坚持,愿意乐观的相信我们仍能成功。

2024年,我们六人团队的营收目标是200万,如果这个目标能够实现,除了能够保证大家的收入不减少以外,还能验证我们的一些猜想,为后年打下一个好的基础。感兴趣的话,年底再来看看,如果目标实现了,我就详细地说说我们这一年是怎么做的;如果目标没实现,我就发个简历找工作。

工作就说这么多吧,接下来是一些碎碎念。

舅舅的骄傲

早上跑步听播客,小盖讲了一个故事。

他叔叔有次开车回老家,在高速路上遇到一个人车坏了。叔叔也没多想,二话没说,就趴倒车底修车。他甚至没有顾及自己的新衣服。修好车之后,只象征性的要了一点费用。

不少人知道这件事,觉得你这人有点傻呀,你得多要点钱。当时那种情况,前不着村后不着店,你要几千他也得给呀。

小盖当时也觉得他傻,但现在对他刮目相看。叔叔是一个工匠,一个手艺人,当时那种情况如果管人要很多钱,甚至是勒索人家,作为手艺人的心气儿就会被破坏。

直到现在,叔叔也不是大富大贵,但每次看到他沉浸在自己的手艺里面的那种神采,那个心气儿,你会由衷为他开心。

听完这个故事,我突然想到自己的舅舅。