【问题标题】:Java SE memory management vs Scala memory managementJava SE 内存管理与 Scala 内存管理
【发布时间】:2018-12-06 11:03:31
【问题描述】:

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

那些“教程”正在讨论堆和堆栈以及它们的工作原理以及它们的用途。

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

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

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

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

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

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

【问题讨论】:

  • 你能解释一下为什么你认为拥有一个堆和一个栈(或多或少所有语言实现都这样做)与函数式编程不一致吗?
  • 据我了解,每个线程都有一个堆和一个堆栈。当我们创建一个对象时,我们在堆中分配内存,但变量存储在堆栈中。所以现在想象一下,我们有几个线程并且我们共享堆内存,其中一些可能会尝试操作相同的值(并发),并且堆中的值可能会随时间而变化(从这里我假设 Java SE 的有状态性质).我想知道内存管理在 Scala 这样的编程语言中是如何工作的,以及是什么使它成为无状态的。我认为内存管理中的某些内容与 java 相比有所不同

标签: java scala memory-management


【解决方案1】:

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

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

堆中的值可能随时间变化

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

【讨论】:

  • “绝对没有理由不能在 JVM 上实现一种纯函数式语言”——您甚至可以用 Java 编写纯函数式程序,而无需对 Java 和/或 JVM 进行任何更改: 只是不要在你的程序中使用副作用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多