Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jvm如何在jvm内存中存储对象_Java_Jvm_Classloader - Fatal编程技术网

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

Java jvm如何在jvm内存中存储对象,java,jvm,classloader,Java,Jvm,Classloader,类加载器加载类后,将在堆上创建一个类对象(java.lang.Class类的对象)。这是由类的计划构成的状态。从类创建的每个对象都将链接到它的类对象(可从对象类中可用的getClass()方法获得,该方法在每个对象中都可用)。类加载的另一个结果是,类中定义的方法的字节码将读入JVM内部内存的MethodArea(请记住,JVM是一个程序,当它执行时,操作系统会给它一些内存-该内存被划分为堆栈、堆和方法区域)。Class对象还包含到MethodArea中类的方法字节码的链接 当类被加载时,整个过程

类加载器加载类后,将在堆上创建一个类对象(java.lang.Class类的对象)。这是由类的计划构成的状态。从类创建的每个对象都将链接到它的类对象(可从对象类中可用的getClass()方法获得,该方法在每个对象中都可用)。类加载的另一个结果是,类中定义的方法的字节码将读入JVM内部内存的MethodArea(请记住,JVM是一个程序,当它执行时,操作系统会给它一些内存-该内存被划分为堆栈、堆和方法区域)。Class对象还包含到MethodArea中类的方法字节码的链接


当类被加载时,整个过程都会发生。我想知道JVM将如何使用Hastable存储所有对象,以及Equals()和hashcode()将如何处理这些对象。

要存储对象,JVM将为其字段和服务信息保留足够的空间。服务信息包括对类对象的引用和用于同步的位


对对象(包括类对象)的所有访问都是通过内存地址完成的。在对象生命周期中,JVM不使用Hashcode和equals。

没有允许您查找所有对象的全局哈希表。您的程序可以在hashCode只抛出错误的对象上运行,因为它只在特定对象上被调用

注意:Object.hashCode()与对象的实际地址无关,它不会随着对象的移动而改变。第一次创建对象时,它没有默认的hashCode(),只有在调用时才会生成。此hashCode()存储在OpenJDK/Hotspot JVM的对象头中


然后JVM将如何知道该类的对象是否已加载

它散列根对象列表,例如线程。从这些线程中,它可以计算出它所引用的所有对象以及所有这些对象等,直到找到所有可访问的对象为止

jvm将如何了解jvm堆中已有的.class文件

JVM在PermGen(而不是堆)中保留一个类表,它可以在加载字节码时查找这些类。当代码运行时,它不必这样做

顺便说一句,PermGen将在Java8中消失

HashTable用于根据hashCode值对对象进行索引

只有编写如下代码时,此哈希表才存在

Hashtable<String, Long> ht = new Hashtable<>();
ht.put("Hello", 1);
Hashtable ht=newhashtable();
ht.put(“你好”,1);
调用
put
时,它将调用String.hashCode(),该函数根据字符串的内容生成一个hashCode,请注意,它不调用Object.hashCode()

如果您想知道String.hashCode()的工作原理,可以在IDE中阅读代码,也可以通过谷歌搜索


顺便说一句,HashMap是您可以使用的,Hashtable是一个遗留类。

我不知道您在第一段中所说的所有内容如何与
equals
hashcode
Hashtable
相关。这些只是方法和类,与其他方法和类一样。它们与内存管理无关。最后,我们的所有对象都将通过使用键值对作为ClassNope加载到哈希表中。Hashtable与JVM的对象管理无关。我知道的是hashCode()方法用于获取特定对象的hashCode(不知道它们将如何计算),HashTable用于根据hashCode值对对象进行索引。然后JVM将如何知道该类的对象是否已被类加载器加载。它是一个类加载器,被要求加载一个类或返回一个已经加载的类对象。为了跟踪已加载类的列表,classloader可以使用哈希表,但键类型是String,并且只使用hashcode和String类的相等项。因为字符串是最终的,所以用户不能重写该方法并影响JVM功能。“JVM如何知道该对象……是否已加载”-这个问题是不正确的。未加载对象。当我们为类创建对象时,.class文件将加载到jvm堆中。并且该对象引用将存储在堆栈内存中。如果我再次为同一类创建新对象,jvm将如何知道jvm堆中已有的.class文件。@user3214269对加载类的引用存储在类加载器中。它是一个类加载器,知道加载了哪些类。见我之前的评论。