java - 关于静态方法和调用堆栈的问题

标签 java jvm

如果我们有这个代码

public static void count(){int i++}

public static void main(String args[])
{
 System.out.println("Not calling the count method");
}

JVM什么时候知道有多少内存以及何时将 count() 方法压入堆栈?

我假设它是在堆栈上分配的。如果这是真的,那么 JVM 如何知道将对象方法压入堆栈,或者从堆中调用它们。?

假设我们有一个对象并且它有一个方法(非静态)。然后,在 main 中,我们创建一个对象,并且不调用它的任何方法。对象所具有的方法是否仍以某种方式分配到内存中?

java中的静态方法是在编译时压入堆栈的吗?对象的非静态方法怎么样?

最佳答案

您对 JVM 如何执行 Java 代码有误解,或者您以错误的方式使用术语。

方法不会被压入堆栈。方法不是“从堆中调用”(甚至不清楚您的意思)。编译时没有任何内容被压入堆栈;调用堆栈仅在运行时存在。

JVM 有一个 call stack 。这意味着每当您调用方法时,JVM 都会将返回地址和方法参数放入堆栈中。当方法返回时,返回地址被弹出,以便 JVM 知道在哪里继续执行代码。在这方面,实例方法和静态方法之间没有区别。

方法的字节码只有一份副本。由于方法的字节码在运行时不会更改,因此为类的每个实例复制该方法的代码没有任何意义(无论该方法是否是静态)。

关于java - 关于静态方法和调用堆栈的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27527178/

相关文章:

java - 连续运行shell脚本时JVM进入休眠状态

java - 如何从http服务器获取重定向url?

java - 使用包含对象的 HashMap 时出现问题

java - 使用 Volley、PHP 和 json 从 Android 中的 MySQL 服务器数据库检索单个数据

java - 对于超过池大小的线程,使用 BeforeExecute 方法扩展线程池执行器无法正常工作

java - jvm如何进入public static void main?

C++ 到 CLR 的字节码编译器?

java - 在内存棒上运行 ECLIPSE

java - 格式化输出中出现意外的空白

java - 尝试打印哈希表,但我不断获取内存位置