jvm性能调优相关
程序员文章站
2024-03-23 22:10:22
...
模拟创建大量对象的情况,代码如下:
public class Person {
String id ;
String name ;
public Person(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class NewTask implements Runnable{
@Override
public void run() {
while(true)
{ ThreadLocal<Person> tl = new ThreadLocal();
String str = new String(""+Thread.currentThread().getName());
Person p = new Person(Thread.currentThread().getName(),Thread.currentThread().getName());
tl.set(p);
System.out.println(p.name);
}
}
}
public class DemoApplication {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 50; i++) {
Thread t = new Thread(new NewTask(),"th"+(i+1));
t.start();
}
}
}
创建50个线程,每个线程都执行创建Person对象,然后放入到线程自己的内存中。为了效果明显,(使用的eclipse)修改内存大小如下:
先看一下 jvisualvm 工具的结果:
至于为何每次到了最大值大概时110mb时,会突然变小。是因为发生了full gc。
我们可以大概计算一下full gc的频率:大概就是92秒一次full gc。
然后我们查看一下对象信息:
创建了大量的ThreadLocal对象和Person对象。
下面是使用jstack命令(jstack -l 3756 )的结果:
上一篇: java中字符输入输出流