Java内存行为:与Thread.sleep不同
我试图用visualvm做一些记忆分析。 我已经编写了一个基本代码,运行无限循环将对象添加到列表中Java内存行为:与Thread.sleep不同,java,multithreading,memory,sleep,behavior,Java,Multithreading,Memory,Sleep,Behavior,我试图用visualvm做一些记忆分析。 我已经编写了一个基本代码,运行无限循环将对象添加到列表中 package home.always.learning.java; import java.util.ArrayList; import java.util.List; public class Heaper { private static List<PersonDetails> listObj = new ArrayList<PersonDet
package home.always.learning.java;
import java.util.ArrayList;
import java.util.List;
public class Heaper {
private static List<PersonDetails> listObj = new ArrayList<PersonDetails>();
private static final String nameConst = "Tarun Trehan";
public static void main(String[] args)throws Exception{
personListCreation();
}
public static void personListCreation() throws Exception
{
int i = 0;
while(true)
{
System.out.println("Looping to create person list...");
i++;
listObj.add(new PersonDetails(nameConst+i));
//Thread.sleep(1000L);
}
}
}
记忆会增加,但随后会稳定下来并继续。请参阅随附的第二张快照,即内存稳定。JPG
我无法理解这种行为?
你能提供你的意见吗
有几件事值得考虑:
- 这些人形尾巴物体有多大李>
- 创建一个不是对象一部分的PersonDetail对象需要多少内存
我不确定这是怎么回事,但你可以做一件事来观察它,就是观察VisualVM中的采样,看看类创建了多少对象,更重要的是它们占用了多少内存。将PersonDetails使用的数量与其他垃圾进行比较,以便在需要时进行清理。查看稍微修改过的代码版本(固定的迭代次数,在启动后添加5s暂停以允许我的IDE连接到visualvm,删除system.out.print以提高速度等)看来你的罪魁祸首是垃圾收集: 100升睡眠:(跑了5:18) 有10L睡眠:(跑了5:01) 带2升睡眠:(跑了4:57) 有1L睡眠:(跑6:36) 使用0L睡眠:(运行时间为0:23)
因此,我们基本上发现,使用的堆将缓慢上升,直到填满Eden空间(导致分配失败),将Eden的较老成员(几乎所有成员,从空间使用情况来看)移动到幸存者0/1,睡眠和不睡眠之间的区别很可能是次要集合和主要集合的相对频率之间的差异。比较相同循环迭代次数(而不是相同时间长度)的行为。显然,它会慢得多,但是存档同样的效果。谢谢你的输入。将尝试发布更新。再次感谢。嗨,我能通过线程观察到记忆的增加。睡眠到位。正如正确指出的,增长的速度是缓慢的,但行为和内存占用最终将是相同的。谢谢
Thread.sleep(1000L);