在思考Java/C#中的编程时,我想知道如何在内存中表示属于对象的方法,以及这个事实如何涉及多线程.
我试着对这些问题下定决心,但我对他们的答案非常不确定.
我已经阅读了一些关于这个主题的帖子:
但我对它们所说明的概念感到困惑:
静态方法(实际上是所有方法)以及静态变量都存储在堆的PermGen部分中,因为它们是反射数据的一部分(类相关数据,而不是实例相关).
因此,方法,无论是否static只存储在类中的堆上的一个副本.现在只有一个副本在类中,我解释为所有方法都属于该类,那么为什么Java只能使用实例化的实例调用非静态方法?
为什么我们有非静态方法属于实例的概念,而不是类?
当我们创建一个类的实例时会发生什么?我的意思是,该类的每个字段和方法都将在该对象内(具有已分配的内存),或者它内部没有任何内容并且具有对其类的引用.(第一种选择看起来像浪费内存.)
问题
背景
我正在尝试测量对象的大小,并意识到方法不会存储在与对象数据相同的位置.
我正试图"看到"方法的代码存储在正在运行的Java应用程序中.
我尝试使用jmap转储堆并使用jhat检查转储,但是我找不到任何有用的关于我的类的方法的地方.