2012-07-14 35 views
3

所以我正在读JVM规范,和所遇到的以下部分:可以将JVM的方法区域垃圾收集?

虽然方法面积为逻辑堆的一部分,简单实现可以选择不对其进行回收或压缩。

我不知道我明白了,这是说JVM中的文本段可以被垃圾收集吗?我应该怎么理解?

回答

3

我不确定我是否明白,这是说JVM中的文本段可以被垃圾回收?

这通常不是指在Unix/Linux意义上的“文本”(单词)或“文本段”。它指的是动态分配的内存区域,其中包含方法的字节码和/或JIT编译的本机代码。这是说,那些内存段可能被垃圾收集...取决于JVM的实施,等等,但这不是JVM规范的要求。


在JVM实现中Java字节代码被编译为本地代码并链接到可执行映像提前,你将有“文本段”,而那些文本段不会受垃圾收集。 (他们不能,因为他们是只读的,并可能在同一时间执行应用程序的其他实例共享。)

+0

!我想知道他们是如何实现GC回忆那些方法是,这必须是一个完全不同的gc是用来收集数据的存储。 – zinking 2012-07-14 06:26:55

+0

那么,当“方法区”是动态分配的是,JVM通常所说的那样在PermGen的堆。这仍然受制于典型的现代JVM中的垃圾收集。但是,除非你正在做聪明的事情与类加载器,该“方法区”的对象将保持可为应用程序的整个生命周期,因此永远不会被收集。 – 2012-07-14 06:32:00

2

当一个方法执行时,局部变量位于堆栈上。

可以想象,JVM可能会选择不收集局部变量并在下次执行该方法时重新使用相同的内存。这种选择只会在单线程运行时环境中理解。

+0

对不起,我还是不太明白:你谈论的框架可能是重用?我所关心的是方法区“文本段”,可能是GCed。 – zinking 2012-07-14 02:11:22

+0

我不认为这个问题中引用的句子是指堆栈帧。我认为“方法区域”是指方法**代码**所在的应用程序内存区域。 – 2012-07-14 06:17:27

+0

@StephenC我的意思是堆栈。我认为堆栈。但我写了堆。确切地说, – Bohemian 2012-07-14 06:44:27