云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

18|被忽视的变量:带你全面认识JVM中的变量

你好,我是康杨。今天我们来重新审视一下 JVM 中的变量。
变量是我们操作 JVM 的最小单元,它在日常工作中很容易被忽略掉,而实际上它对内存管理和垃圾回收机制的影响很大。
深入地了解变量有助于我们理解强引用、弱引用和虚引用之间的区别以及对对象回收的影响,帮助我们更加灵活地使用 Java 内存模型,避免一些特殊情况下的内存泄漏和性能问题。而学会从不同的维度去认识变量,也是我们写出高性能的程序的基础。

JVM 中的变量

这节课我们将通过一个实际的例子去了解 JVM 中的变量以及变量中的类型。

静态类型和实际类型

Food food = new Fruit();
作为一个变量 food,它有一个静态类型和一个实际类型。静态类型是指变量最初被定义时的类型,而实际类型则是指变量所引用的对象的类型。当变量指向一个子类对象时,就有了多态的能力。让我们先看一下下面这段代码。
class Food {
public void eat() {
System.out.println("Eat some food");
}
}
class Fruit extends Food {
@Override
public void eat() {
System.out.println("Eat some fruits");
}
public void peel() {
System.out.println("Peel the fruit");
}
}
class Main {
public static void main(String[] args) {
Food food = new Fruit();
food.eat(); // 输出: Eat some fruits
if (food instanceof Fruit) {
Fruit fruit = (Fruit) food;
fruit.peel(); // 输出: Peel the fruit
}
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了JVM中变量对内存管理和垃圾回收机制的重要影响。首先介绍了静态类型和实际类型的概念,以及多态的实现原理。随后详细解读了变量的生存空间,包括栈上、堆中和方法区中的变量创建位置和生命周期。此外,还探讨了不同类型引用的特性和使用场景,如强引用、软引用、弱引用和虚引用。最后指出了在不同场景需求下选择不同引用类型可以更有效地管理内存,提高程序性能。文章还对命令式编程和声明式编程的区别进行了阐述,强调了声明式编程更注重描述问题的“是什么”,而不是解决问题的“如何”。通过理解这些概念,读者可以更好地理解变量的静态类型和实际类型之间的关系、多态的原理、不同引用类型的特点和用途,以及命令式编程和声明式编程的区别。整体而言,本文对读者理解JVM和Java程序的运行机制具有很大帮助。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 黄海峰
    感觉,声明式编程就是封装了一下命令式编程而已

    作者回复: 你的理解有一定道理。实际上,声明式编程是一种更高级别的抽象,它强调的是“做什么”,而非“怎么做”。而命令式编程则是具体制定了执行步骤,告诉计算机“怎么做”。 在声明式编程中,我们只需要描述我们想要什么,而不需要详细描述如何得到它。这种编程方法抽象了很多底层细节。比如SQL就是一种典型的声明式语言,在编写SQL查询时,我们并不需要关心数据库如何寻找或排序数据,只需声明我们想要什么样的结果。 而在命令式编程中,我们一步步告诉计算机如何完成任务,每一步都必须详细描述。大部分编程语言,像C,Python,Java等都属于这种类型。 当然,为了实现声明式编程的语言或框架,背后往往需要命令式编程做支撑,所以你可以说声明式编程封装了命令式编程。但这样的封装为我们的编程指明了更清晰的目标,并且能够让我们的代码更易读和简洁,这是其价值所在。而声明式与命令式区别,也可以看成是阿隆佐邱奇和图灵的区别,建议你看一下https://www.yinwang.org/blog-cn/2013/07/13/church-turing

    2023-10-09归属地:广东
    2
  • ple
    这儿表达有些误解,Java8以后文中的静态变量存储在堆上。https://openjdk.org/jeps/122
    2024-01-21归属地:浙江
    2
  • 八宝
    我们还可以从哪些视角来看待 Java 中的变量? 从线程安全的角度看,常量天生安全,那么我们用的最多的变量呢? 1.方法区创建的变量(既静态变量),并发访问时会存在线程安全问题,需要加锁来保证数据的正确性。 2.堆中创建的变量,如果不存在逃逸现象,不存在跨线程使用,不需要考虑线程安全; 涉及到多线程访问,如 HashMap 等容器的并发 put,就要加锁或改用线程安全的容器。 3.如果在栈上创建的变量,生命周期都是方法内,随着方法的执行,出栈就会被回收,不需要考虑线程安全。
    2023-12-20归属地:河南
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部