如何在scala中进行内存分配

时间:2015-12-18 06:44:20

标签: java scala memory memory-management 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
}
  • 现在因为scala中的所有内容都是一个对象所以内存分配将如何发生?
  • 除了引用变量之外,一切都会在堆中获取内存吗?
  • 在java中创建类实例时,该类中的方法和变量获取堆中的内存。如何在这里使用Singleton Objects?
  • 如果一切都在堆中,它会不会影响性能?
  • 与Java一样,Memory分为5个部分,即Heap,Stack,MethodArea等。在scala中,内存分配是如何进行的?

1 个答案:

答案 0 :(得分:5)

Scala JVM 上运行,它基于Java库。

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

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

将被翻译为(通过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$();
}
class A{  
    val arg1=1
    def myFun(arg2:Int)=arg1
}

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

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

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

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

public abstract int arg1();

public abstract int myFun(int);

}

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