【问题标题】:Mapping a Java program to an Operating System process将 Java 程序映射到操作系统进程
【发布时间】:2012-05-23 12:12:02
【问题描述】:

我想知道这是怎么发生的:Java 程序如何映射到 OS 进程(如下面的 Linux 所示):

在 C 中,它是一个程序如何编写以及整个调用堆栈如何在操作系统中进行的直接关联。我想知道如何在 Java 中实现映射?方法 meth(),在对象上调用:obj,是否只是转换为定位 obj.meth() 的地址,然后在堆栈上使用它在 C 中的方式?

提前致谢!

编辑:我也很想知道其他 OOP 语言(C++、Python 等)通常使用的模型。

【问题讨论】:

  • 请注意,即使对于 C,给定的图片已经是一个严重的简化。例如,不一定只有一个堆(如果你有很多线程想要分配内存,那么只有一个堆是个坏主意),然后是线程特定的数据等等。魔鬼在细节中,如果你想想即使是简单的 C 运行时也会变得多么复杂,想象一下 JVM 的样子:)
  • 当然,我只是想讨论一个单线程进程的简单案例:)

标签: java compiler-construction process operating-system callstack


【解决方案1】:

这是一个相当复杂的问题。这是关于这个主题的一个很好的article。简而言之,Java 有两种执行模式,它们极大地影响了内存布局。

  1. 部分代码由解释器执行
  2. 一些代码被编译为本机代码以获得更好的性能。

查看此 wiki 页面:http://en.wikipedia.org/wiki/Just-in-time_compilation

并且 JVM 获得了更多类型的内存区域,例如 perm-gen、JIT 内存等。

这在其他线程中有很好的讨论:

  1. java and memory layout
  2. jdk1.6 memory layout

【讨论】:

  • 好吧,我不会说它在其他两个线程中“讨论得很好”。但是正如您所说,JVM的内存布局非常复杂,这意味着a)没有多少人可以认真回答这个问题(我不能;我知道存在哪些内存空间以及它们基本上做什么,但是布局或其他细节?咬我)和b)即使有人想要它也将是一个非常笨拙的帖子。不确定它是否适合 SO。
【解决方案2】:

大多数 Java JVM 都是纯 C 程序。所以图片将与正在解释/执行的第一个类文件相同。

之后,它取决于 JVM 实现。通常,他们会使用堆栈存储来跟踪控制类型信息,例如加载了哪些类、正在运行哪些线程等。对于实际的“程序”存储,解释器和垃圾收集器将使用普通的“malloc”/“mfree”来存储分配和释放内存以及一些相当复杂的控制结构以使垃圾收集器能够正常工作。

【讨论】:

    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 2011-05-24
    • 2020-02-20
    • 2018-06-23
    • 2012-02-29
    • 2018-10-09
    • 2016-10-31
    • 2012-03-11
    相关资源
    最近更新 更多