Java SE内存管理与Scala内存管理

时间:2018-12-06 11:03:31

标签: java scala memory-management

我对执行Java程序时内存中发生的事情感到好奇,因此我观看了一些简短的教程,只是对它们有一个基本的了解。

这些“教程”正在讨论堆和堆栈,以及它们如何工作以及它们的目的是什么。

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

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

但是,似乎函数式编程语言不会遭受那些问题的困扰,因为它们是无状态的(所有好处我都不会在这里列出)。

然而,被定义为函数式编程的Scala是基于JVM构建的,因此我相信它具有与Java(SE)相同的内存管理。

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

2)如果内存管理是JVM的独有特性,那么Scala如何定义为一种功能编程语言呢?

1 个答案:

答案 0 :(得分:4)

首先,Scala不是纯粹的功能语言。如果需要,它具有可变的变量和数据结构。但是,这不是JVM具有堆和栈的结果,而仅仅是语用。实际上,大多数功能语言并不是纯粹的功能。

也就是说,确实存在的纯功能语言(例如,Haskell)也有一个堆和一个堆栈(或者每个线程一个堆栈),并且绝对没有理由不能在该语言上实现纯功能语言。 JVM(除了实用的JVM之外,最好能够与Java库进行互操作,其中许多库具有可变对象)。

  

堆中的值可能随时间变化

如果您更改堆(或相应的堆栈)中的值,则它们也会更改。如果您不更改它们,则它们也不会更改。如果您的语言不允许您更改它们,则它们不能更改。关于堆栈或堆的任何事情都不会阻止语言具有不变的变量和/或对象。就像没有什么阻止您在Java中声明所有变量final(并且仅使用也只有final成员的类)一样。