首页 > 解决方案 > Java SE 内存管理与 Scala 内存管理

问题描述

我很好奇当我们执行 Java 程序时内存中发生了什么,所以我看了一些简短的教程只是为了有一个基本的了解。

那些'教程'正在谈论堆和堆栈以及它们如何工作以及它们的目的是什么。

Java SE 作为一种 OOP 语言被定义为有状态的,这意味着变量随时间而变化(例如 x = x + 1 )。

考虑到变量在堆和堆栈中“传播”,我可以理解为什么 Java 是有状态的以及为什么我们会陷入并发问题。

然而,函数式编程语言似乎不受这些问题的影响,因为它们是无状态的(具有我不会在这里列出的所有好处)..

然而,被定义为函数式编程的 Scala 是建立在 JVM 之上的,所以我相信它具有与 Java (SE) 相同的内存管理。

1) 内存管理是 JVM 还是 Java SE 的特性?

2) 如果内存管理是 JVM 的特性,那么 Scala 是如何被定义为函数式编程语言的?

标签: javascalamemory-management

解决方案


首先,Scala 不是一种纯粹的函数式语言。如果需要,它具有可变变量和数据结构。然而,这不是 JVM 具有堆和堆栈的结果,而只是语用学。事实上,大多数函数式语言都不是纯粹的函数式。

也就是说,确实存在的纯函数式语言(例如 Haskell)也有一个堆和一个堆栈(或者每个线程一个堆栈),绝对没有理由不能在 JVM(其他与实用的相比,在 JVM 上,提供与 Java 库互操作的能力是一个好主意,其中许多库具有可变对象)。

堆中的值可能随时间变化

如果您更改堆(或堆栈)中的值,它们会发生变化。如果你不改变它们,它们就不会改变。如果您的语言不允许您更改它们,它们就无法更改。堆栈或堆不会阻止语言具有不可变的变量和/或对象。就像没有什么可以阻止您final在 Java 中声明所有变量(并且只使用也只有final成员的类)。


推荐阅读