java - Java SE 内存管理与 Scala 内存管理
问题描述
我很好奇当我们执行 Java 程序时内存中发生了什么,所以我看了一些简短的教程只是为了有一个基本的了解。
那些'教程'正在谈论堆和堆栈以及它们如何工作以及它们的目的是什么。
Java SE 作为一种 OOP 语言被定义为有状态的,这意味着变量随时间而变化(例如 x = x + 1 )。
考虑到变量在堆和堆栈中“传播”,我可以理解为什么 Java 是有状态的以及为什么我们会陷入并发问题。
然而,函数式编程语言似乎不受这些问题的影响,因为它们是无状态的(具有我不会在这里列出的所有好处)..
然而,被定义为函数式编程的 Scala 是建立在 JVM 之上的,所以我相信它具有与 Java (SE) 相同的内存管理。
1) 内存管理是 JVM 还是 Java SE 的特性?
2) 如果内存管理是 JVM 的特性,那么 Scala 是如何被定义为函数式编程语言的?
解决方案
首先,Scala 不是一种纯粹的函数式语言。如果需要,它具有可变变量和数据结构。然而,这不是 JVM 具有堆和堆栈的结果,而只是语用学。事实上,大多数函数式语言都不是纯粹的函数式。
也就是说,确实存在的纯函数式语言(例如 Haskell)也有一个堆和一个堆栈(或者每个线程一个堆栈),绝对没有理由不能在 JVM(其他与实用的相比,在 JVM 上,提供与 Java 库互操作的能力是一个好主意,其中许多库具有可变对象)。
堆中的值可能随时间变化
如果您更改堆(或堆栈)中的值,它们会发生变化。如果你不改变它们,它们就不会改变。如果您的语言不允许您更改它们,它们就无法更改。堆栈或堆不会阻止语言具有不可变的变量和/或对象。就像没有什么可以阻止您final
在 Java 中声明所有变量(并且只使用也只有final
成员的类)。
推荐阅读
- python-2.7 - 序列化和反序列化之间的底层类变化
- javascript - 将所有 HTML 表值传递给 PHP 以使用 Javascript 将它们存储在数据库中
- windows - Robotframework-WhiteLibrary:Windows 应用自动化:单击按钮关键字导致失败
- python - 重新分配的数组(Python)
- ssl - 自定义域 Heroku 应用程序无法提供安全连接:ERR_SSL_PROTOCOL_ERROR
- redirect - Azure web.config 永久重定向并获得 307 状态码而不是 301
- javascript - 如何按业力对 Reddit 用户进行排序?
- hyperledger-fabric - Hyperledger Fabric:fabric-ca-server 启动后有什么方法可以更改它的设置吗?
- excel - 在整行中查找部分文本
- php - registeringArray 时出错([0] => 42S22 [1] => 1054 [2] => '字段列表'中的未知列'名称')