java占内存代码 java占内存怎么办

如何用Java编写一段代码引发内存泄露1、首先得搞清楚什么叫内存泄露,简单来说就是一个东西放在内存里的时间太长了,当你的程序都跑完了,它还存在那里 。这时它是白白的占用了你的内存 , 累积起来占用的内存越来越多……最后就会导致JVM报错:out of memory 。
【java占内存代码 java占内存怎么办】2、一般情况下,别人如果能指出你的系统(程序)内存溢出,这个人应该还是挺厉害的 。通常对于新人来说,喜欢把变量直接定义在class下(此时称之为实例变量,或者成员变量),那么在方法里调用后 , 这个实例变量是不会被释放的,大量的这样使用就可能会引发内存泄露 。
3、把变量定义在方法里,当这个方法执行完毕后内存就得到释放了,这是个好习惯 。
4、如果想要看到内存溢出,可以按这样的思路去尝试一下:定义一个静态的实例变量(list或其它集合) , 然后在一个方法里循环往这个静态变量塞东西,直到这个实例变量撑爆你的jvm内存 。很快你就能看到out of memory……
import java.util.ArrayList;
import java.util.List;
public class MemoryTest {
private static List list = new ArrayList();
private static int count = 0;
public static void main(String[] args) throws InterruptedException {
System.out.println("申请前的可用内存 = "+getFreeMemory());
while(true){
list.add(new byte[1024*1024]);//用实例变量申请1M内存 , 当方法执行完毕时,这个static的变量是不会被释放
count++;
if (count % 100 == 0) {
System.out.println("当前list.size()="+list.size()+",可用内存 = "+getFreeMemory());
Thread.sleep(500);
}
}
}
public static long getFreeMemory() {
return Runtime.getRuntime().freeMemory() / (1024 * 1024);
}
}
如何计算Java对象所占内存的大小java中可以用.getBytes().length获取字符串占用内容的大小,原理是java中任何字符都采用Unicode编码,所以衡量占用内存大小采用占用的字节数 。
举例如下:
public
class
TestStringSize
{
public
static
final
void
main(String[]
args)
{
System.out.println("占用内存大?。?+"学java".getBytes().length);
}
}
输出结果:
占用内存大?。?
byte
Java开发如何准确的定位到占用内存或CPU最高的一行代码要定位到行,代码要debug编译,至少要带上行信息 。
线程占用内存高低,可以用jmap做heap dump出来给MomoryAnalysis分析他可以按线程统计,一般也可以用它来找出造成OOM的原因 。
线程占用CPU , 上述内存的问题是一个方面,另外也可以jstack打线程栈来分析 。Linux上ps -T -p可以看底层线程的CPU占用(Windows上需要额外按工具),记得线程编号可以在jstack打出来的线程栈中检查 。
请问用Java代码,怎样测试一段程序占用了多少内存?你可以先用内存监控工具,进行监控,看看这个功能到底用多少内存 。如果不多,其实都不需要实现你说的代码监控的 。如果你要使用代码监控,你可是使用Runtime类的几个属性,MaxMemory、FreeMemory、TotalMemory 。然后实现个线程,在下载pdf功能前开启线程,然后完毕时关闭线程,如果内存即将溢出(设定个阈值,比如说15%) , 就报错 , 跳转到错误页面 。
javaset占用内存大小javaset将占用16个字节的空间 。因此 , 最初我将条目数乘以16以获取内存 。但实际上,每个条目的内存远远超过16个字节 。之后,我研究了HashSet的实现 。简而言之,在基础实现中,它实际上在哈希集的每个条目中存储了一个额外的伪对象(12个字节) 。还有一个指向下一个条目的指针(8个字节) 。因此,每个条目将额外浪费12 + 8个字节 。

推荐阅读