作为ClassLoader的类加载的结果,将在堆上创建Class对象(类java.lang.Class的对象)。这就是作为国家的阶级计划。从类创建的每个对象都将链接到其Class对象(可从Object类中可用的getClass()方法获得 - 在每个对象中都可用)。同样作为类加载的结果,类中定义的方法的字节码将读入JVM内部存储器的MethodArea(请记住,JVM是一个程序,当它被执行时由操作系统给出一些内存 - 这个内存被划分为Stack,Heap,Method Area)。 Class对象也包含MethodArea中类的方法字节码的链接。
这个过程将在加载类时发生我想知道JVM如何使用Hastable存储所有对象,我们的equels()和hashcode()将如何使用它。
答案 0 :(得分:0)
要存储对象,JVM会为其字段和服务信息保留足够的空间。服务信息包括对类对象的引用和用于同步的位。
对对象(包括类对象)的所有访问都是通过内存地址完成的。在对象生命周期中,JVM不使用Hashcode和equals。
答案 1 :(得分:0)
没有全局散列表允许您查找所有对象。您的程序可以运行hashCode只是抛出错误的对象,因为它只在特定对象上调用。
注意:Object.hashCode()与对象的实际地址无关,并且在对象移动时不会发生变化。首次创建对象时,它没有默认的hashCode(),只有在调用时才会生成。此hashCode()存储在OpenJDK / Hotspot JVM的对象头中。
然后JVM将如何知道该类是否已加载
它对根对象列表进行哈希处理,例如线程。从这些线程中,它可以计算出它所引用的所有对象以及所有这些对象等,直到它找到所有可到达的对象。
jvm如何知道jvm堆中已存在的.class文件。
JVM在PermGen(不是堆)中保留一个类表,它可以在加载字节代码时查找这些类。代码运行时,它不必执行此操作。
BTW PermGen将在Java 8中消失。
HashTable用于根据hashCode值索引对象。
只有编写
之类的代码时,才会存在此HashTableHashtable<String, Long> ht = new Hashtable<>();
ht.put("Hello", 1);
当调用put
时,它会调用String.hashCode(),它会根据字符串的内容生成一个hashCode,注意这个不会调用Object.hashCode()
如果您想知道String.hashCode()如何工作,您可以在IDE中读取代码,或使用Google搜索。
BTW你可以使用HashMap,Hashtable是一个遗留类。