如何运用 JVM 知识提高编程水平

本文探讨了 JVM 的重要性,包括其跨平台性和多语言支持。通过分析递归与尾递归、并发编程中的 ReentrantReadWriteLock 和 synchronized 性能,展示了 JVM 在代码优化中的作用。同时,介绍了 JVM 参数调优,以及在不同场景下选择 Scala、Groovy 等 JVM 语言的策略。深入解析了实时 GC 原理和内存模型,为提高编程水平提供了宝贵指导。
摘要由CSDN通过智能技术生成

什么是 JVM?

 A **J**ava **V**irtual **M**achine(JVM)is an abstract computing machine that enables a computer to run a Java program – wikipedia.org

 JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 – baike.baidu.com

为什么要有 JVM?

跨平台性

 JVM 的存在,使得 Java 程序 能够轻易地在多平台上移植,基本上脱离了对硬件的依赖性(这也满足了 David Parnas 的 “信息隐藏” 准则)

多语言性

 因为底层 JIT 编译优化、GC、JUC 对多线程并发编程的支持,以及社区中海量成熟的库 等优点,使得 很多语言 都开发出可运行在 JVM 上的版本
 同时,多语言混合编程成为一种趋势,在需要快速开发、灵活部署 和 针对特定问题的 DSL 等场景下,选择恰当的 JVM-hosted language,可以最大化原有代码的价值

那么,在日常的开发过程中,究竟应该如何运用这些 遥不可及的 JVM 知识,来逐步提高实际编程水平呢? 上下而求索了一番后,找到了以下几个层面作为出发点

编码层面

递归 vs. 尾递归

循环调用
def inc(i: Int): Int = i + 1

# 10 亿次 for 循环调用
0: aload_0                                                                                 |从局部变量 0 中装载引用类型值
1: getfield         #29  // Field i$1:Lscala/runtime/IntRef;                               |从对象中获取字段
4: getstatic        #33  // Field com/yuzhouwan/jit/Inc$.MODULE$:Lcom/yuzhouwan/jit/Inc$;  |从类中获取静态字段
7: aload_0                                                                                 |从局部变量 0 中装载引用类型值
8: getfield         #29  // Field i$1:Lscala/runtime/IntRef;                               |从对象中获取字段
11: getfield        #38  // Field scala/runtime/IntRef.elem:I                              |从对象中获取字段

14: invokevirtual   #42  // Method com/yuzhouwan/jit/Inc$.inc:(I)I                         |运行时按照对象的类来调用实例方法
17: putfield        #38  // Field scala/runtime/IntRef.elem:I                              |设置对象中字段的值

20: return                                                                                 |从方法中返回,返回值为 void

# 被调用的累加方法
0: iload_1                 |从局部变量 1 中装载 int 类型值入栈
1: iconst_1                |1(int) 值入栈
2: iadd                    |将栈顶两 int 类型数相加,结果入栈
3: ireturn                 |返回 int 类型值

10 亿次循环,大约 4014 ms
递归
def rec(i: Int): Int = {

  if (i == 1) return 1
  rec(i - 1) + 1  // change 1 to i, then counting...
}

0: iload_1                                      |从局部变量 1 中装载 int 类型值
1: iconst_1                                     |1(int) 值入栈
2: if_icmpne       7                            |若栈顶两 int 类型值前小于等于后则跳转
5: iconst_1                                     |1(int) 值入栈
6: ireturn                                      |返回 int 类型值

7: aload_0                                      |从局部变量 0 中装载引用类型值
8: iload_1                                      |从局部变量 1 中装载 int 类型值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值