但在流行的SO答案中,我发现永久生成不是堆的一部分
永久生成(非堆):包含虚拟机本身的所有反射数据的池,例如类和方法对象.对于使用类数据共享的Java VM,这一代分为只读和读写区域.
我搞砸了这些矛盾的数据.我相信在这两个地方数据有效但有保留.请为我澄清这个问题.
我只谈谈Sun/Oracle jvms.
我已经阅读了jvm gcs(串行,并行,cms和g1)的解释,我没有看到关于permgen的提及,它认为永久生成不是堆部分.
我已经阅读了一些关于这个主题的帖子:
但我对它们所说明的概念感到困惑:
静态方法(实际上是所有方法)以及静态变量都存储在堆的PermGen部分中,因为它们是反射数据的一部分(类相关数据,而不是实例相关).
因此,方法,无论是否static只存储在类中的堆上的一个副本.现在只有一个副本在类中,我解释为所有方法都属于该类,那么为什么Java只能使用实例化的实例调用非静态方法?
为什么我们有非静态方法属于实例的概念,而不是类?
是一个"静态决赛"直接分配到年轻一代或老一代或perm gen?(我想它很可能会在我想的时候进入老一代.)如果它是在perm gen中分配的那么,当它在Perm Gen中进行类卸载时会被垃圾收集吗?
我有一个基本问题.考虑这个简单的代码:
class A{
void someMethod(){
B b = new B(); // Line 3
B c = new B(); // Line 4
}
}
Run Code Online (Sandbox Code Playgroud)
当执行第3行时,将类B加载到内存中(即:我们为类型为'Class'的对象分配物理空间(假设使用id - classLaoder1.B),类型包含类B的代码).
问题1#接下来会发生什么? - B类(占B的状态)的实例被创建基于该classLoader.B实际上包含B的信息的事实(已分配的物理内存)?
问题2#另外,在第-4行,由于classLoader.B存在于内存中,因此在内存中创建了一个包含c状态的对象?
我正在尝试在Rust中实现一个简单的解释器,用于编写一个编程语言rlox,跟随Bob Nystrom的书Crafting Interpreters.
我希望错误能够在任何子模块中发生,并且在main模块中"报告"它们(这在书中通过Java完成,只需在包含类的类上调用静态方法打印违规令牌和线).但是,如果发生错误,那就不像我可以尽早返回Result::Err(我认为,这是处理Rust中错误的惯用方法),因为解释器应该继续运行 - 不断寻找错误.
有没有(惯用)方式来模拟从Rust中的子类中使用模块调用父类的静态方法的Java行为?我应该完全抛弃这样的东西吗?
我想到了一个战略,我注入一些参考ErrorReporter结构作为一个依赖入Scanner和Token结构,但似乎笨拙的我(我不觉得自己是个错误报告应该是结构签名的一部分,是我错了吗?) :
struct Token {
error_reporter: Rc<ErrorReporter>, // Should I avoid this?
token_type: token::Type,
lexeme: String,
line: u32
}
Run Code Online (Sandbox Code Playgroud)
这是我的项目的布局,如果您需要可视化我正在谈论的模块关系.很高兴在必要时提供一些源代码.
rlox [package]
????src
????main.rs (uses scanner + token mods, should contain logic for handling errors)
????lib.rs (just exports scanner and token mods)
????scanner.rs (uses token mod, declares scanner struct and impl)
????token.rs (declares token struct and impl)
Run Code Online (Sandbox Code Playgroud) 我浏览了许多帖子,但似乎都回答了接口的静态方法存储在哪里。但是,接口可以具有抽象、静态和默认方法。我知道静态和抽象方法。但是,我无法在内存中找到与默认方法存储相关的任何内容。
我可能错了,但我认为默认方法将存储在静态堆空间中,就像实例方法与类一起存储一样。但是,除此之外,考虑到实现类不会覆盖接口中默认方法的实现并且没有菱形问题,如果默认方法也被分配给堆栈帧,我也很困惑。
我参考了以下链接:
java ×5
heap-memory ×2
classloader ×1
heap ×1
interpreter ×1
java-8 ×1
jvm ×1
permgen ×1
rust ×1
static ×1