Breakpoint命中Hashmap.put()一个简单的Hello World程序

时间:2015-12-06 12:02:18

标签: java debugging breakpoints

程序很简单:

put(K key, V value)

现在我在HashMap.class

中将断点设置为函数public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key);
put()

然后我开始调试HelloWorld.class,它将运行到HashMap中的断点。我很奇怪它在HashMap中如何遇到#include <stdio.h> void sample_check(void) { printf("INFO: Function sample_check() called.\n"); } ? 我尝试过HashMap,Hashtable,它们都是一样的。

3 个答案:

答案 0 :(得分:17)

以下是我在重现场景时获得的堆栈跟踪。

当Eclipse启动应用程序时,它不会简单地进入主函数。在创建实例之前,需要将类加载到JVM中。为此,将使用类加载器

在您的情况下,URLClassLoader有一个URLClassPath类型的成员,使用HashMap对象

enter image description here

答案 1 :(得分:9)

这是因为Eclipse启动应用程序的方式。

运行应用程序的Eclipse LauncherHelper类(HelloWorld)调用URLClassLoader以及其他大量内容。 URLClassLoader使用HashMapsHashTables

答案 2 :(得分:4)

由于您已经在使用调试器,因此您还应该能够看到显示调用put方法的位置的帧。在IntelliJ中它看起来像这样:

frames

正如您在此处所见,当JVM尝试加载某个类时调用该方法:此处它是您的HelloWorld类。它可以在那里调用main方法。

由于JVM刚刚启动,它需要填充HashMap<String, URLClassPath.Loader> lmap类中的某个sun.misc.URLClassPath。此映射包含已使用资源的条目,例如已使用的jar文件(例如Java安装中的jar文件)或.class位置,例如项目的“bin”目录。 然后在应用程序的运行时使用它。

但是也会使用Map,然后JVM加载java.security.Permissions中具有Map<Class<?>, PermissionCollection> permsMap的“权限”。

如您所见,put方法的调用与您自己的应用程序的内容无关。它仅用于为Java环境和应用程序运行时加载基本内容。

顺便说一句:尝试熟悉您的调试器,它将帮助您理解为什么调用某些方法以及执行该调用的类/方法。