jvm如何在jvm内存中存储对象

时间:2014-02-13 06:22:06

标签: java jvm classloader

作为ClassLoader的类加载的结果,将在堆上创建Class对象(类java.lang.Class的对象)。这就是作为国家的阶级计划。从类创建的每个对象都将链接到其Class对象(可从Object类中可用的getClass()方法获得 - 在每个对象中都可用)。同样作为类加载的结果,类中定义的方法的字节码将读入JVM内部存储器的MethodArea(请记住,JVM是一个程序,当它被执行时由操作系统给出一些内存 - 这个内存被划分为Stack,Heap,Method Area)。 Class对象也包含MethodArea中类的方法字节码的链接。

这个过程将在加载类时发生我想知道JVM如何使用Hastable存储所有对象,我们的equels()和hashcode()将如何使用它。

2 个答案:

答案 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值索引对象。

只有编写

之类的代码时,才会存在此HashTable
Hashtable<String, Long> ht = new Hashtable<>();
ht.put("Hello", 1);

当调用put时,它会调用String.hashCode(),它会根据字符串的内容生成一个hashCode,注意这个不会调用Object.hashCode()

如果您想知道String.hashCode()如何工作,您可以在IDE中读取代码,或使用Google搜索。

BTW你可以使用HashMap,Hashtable是一个遗留类。