【问题标题】:How memory allocation takes place in scalascala中如何进行内存分配
【发布时间】:2015-12-18 06:44:20
【问题描述】:

我们知道,与 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 中,当创建类实例时,该类中的方法和变量会在堆中获取内存。这里的单例对象是如何发生的?
  • 如果一切都在Heap中,会不会影响性能?
  • 与 Java 一样,内存分为 5 个部分,即 Heap、Stack、MethodArea 等。那么在 scala 中,内存分配是如何进行的?

【问题讨论】:

  • 所以您的问题或多或少是:内存管理如何大规模工作?
  • 类型是统一的,但这并不意味着在运行时“一切都是对象”。
  • 如果 Scala 类具有分配给文字的 val ,似乎还有优化空间。你会认为带有文字赋值的 val 可以在 Java 领域转换为静态 final,因为在任何类实例化中值永远不会改变

标签: java scala memory memory-management allocation


【解决方案1】:

ScalaJVM 上运行,它基于 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 相同。

【讨论】:

  • 谢谢@chengpohi,我接受你的回答。但是您能否澄清一下这行的含义:"public static final A$ MODULE$;" 以及为什么将 val arg1=1 转换为 private final int arg1; i> 和 public int arg1(); 我的意思是我理解转换为 private final int agr1;但不清楚 public int arg1()。
猜你喜欢
  • 2017-06-06
  • 2016-05-31
  • 2011-03-10
  • 1970-01-01
  • 2014-09-26
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多