如何在scala中进行内存分配

Apo*_*rma 7 java memory memory-management scala allocation

我们知道,与java不同,scala将所有东西都作为对象.

例如我们有 -

object A{
    val arg1=1
    def myFun(arg2:Int)=arg1
}

class A{  
    val arg1=1
    def myFun(arg2:Int)=arg1
}

trait A{
    val arg1=1
    def myFun(arg2:Int)=arg1
}
Run Code Online (Sandbox Code Playgroud)
  • 现在因为scala中的所有内容都是一个对象所以内存分配将如何发生?
  • 除了引用变量之外,一切都会在堆中获得内存吗?
  • 在java中创建类实例时,该类中的方法和变量将获取堆中的内存.Singleton Objects如何在这里发生?
  • 如果一切都在堆中,它会不会影响性能?
  • 与Java一样,Memory分为5个部分,即Heap,Stack,MethodArea等.在scala中,内存分配是如何进行的?

che*_*ohi 5

ScalaJVM上运行,它基于Java库.

scala文件(*.scala)将被编译为java类字节码并在JVM上运行它们.为你的例子:

object A{
    val arg1=1
    def myFun(arg2:Int)=arg1
}
Run Code Online (Sandbox Code Playgroud)

将被翻译为(由javap反编译字节码):

public class A$ extends java.lang.Object{
    public static final A$ MODULE$;
    private final int arg1;
    public static {};
    public int arg1();
    public int myFun(int);
    public A$();
}
Run Code Online (Sandbox Code Playgroud)
class A{  
    val arg1=1
    def myFun(arg2:Int)=arg1
}
Run Code Online (Sandbox Code Playgroud)

将被翻译为(由javap反编译字节码):

public class A extends java.lang.Object{
    private final int arg1;
    public int arg1();
    public int myFun(int);
    public A();
}
Run Code Online (Sandbox Code Playgroud)
trait A{
    val arg1=1
    def myFun(arg2:Int)=arg1
}
Run Code Online (Sandbox Code Playgroud)

将被翻译为(由javap反编译字节码):

public interface A{
public abstract void $line5$$read$A$_setter_$arg1_$eq(int);

public abstract int arg1();

public abstract int myFun(int);

}
Run Code Online (Sandbox Code Playgroud)

所以对于你的其他记忆问题,我认为它与Java相同.