|
|
1
8
与jconsole通信会导致对象被分配。我相信你在这里看到的是你测量方法的产物。编译代码时,也可能会按热点进行少量分配。如果您担心,请使用探查器查看正在分配的内容(再次注意探查器接口的分配)。 正常的gc行为是为了避免不必要地运行。你会在网络上看到所有关于内存使用的锯齿形图。在缓存和交换友好性和避免工作之间有一些折衷。此外,服务器热点在耗尽内存方面比客户端热点更为激进。 |
|
|
2
4
是的,这应该是预期的行为。虽然您没有做任何特定的分配对象的操作,但是sleep的实现可能是,即使没有,jvm中也可能运行其他线程。 |
|
|
3
3
是的,这很正常。您没有显式地创建任何对象,但调用的方法可能会创建一些临时对象作为其实现的一部分。这些临时对象会堆积起来,直到gc运行时清除它们。 |
|
|
4
2
类文件看起来是这样的,代码从8循环到14,java.lang.thread.sleep()是本机的。因此没有理由创建MB的对象
恐怕您看到的是jprofiler本身(我不知道您是如何将它附加到您的虚拟测试应用程序上的)或运行在这个vm中的其他东西。如果jprofiler不显示此信息,则应执行堆转储以了解创建了哪些对象。 ' |
|
|
5
1
关于原因,显然有两种理论,基于经验推理是不可能区分它们的。我能建议一个简单的实验吗?
我怀疑你等着GC在最后一个案子中运行时会失去耐心…甚至呼叫
|