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);
}
}
内存溢出的解决方法内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存 。
内存中加载的数据量过于庞大,如一次从数据库取出过多数据;集合类中有对对象的引用 , 使用完后未清空,使得JVM不能回收;代码中存在死循环或循环产生过多重复的对象实体;使用的第三方软件中的BUG;启动参数内存值设定的过?。?
检查对数据库查询中,是否有一次获得全部数据的查询 。一般来说 , 如果一次取十万条记录到内存 , 就可能引起内存溢出 。这个问题比较隐蔽 , 在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了 , 一次查询就有可能引起内存溢出 。因此对于数据库查询尽量采用分页的方式查询 。
检查代码中是否有死循环或递归调用 。
如何排查Java内存泄露1.打开/tomcat_home/bin/catalina.bat文件
2.加上:set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdumpjava代码检查内存泄漏,这样当内存溢出是就会在对应路径下生成dump文件
运行程序打开jdk bin 文件夹下再带java代码检查内存泄漏的 jvisualvm.exe
选择tomcat线程java代码检查内存泄漏,打开实时监控页面可以看到对应java代码检查内存泄漏的堆栈线程和装在类,内存java代码检查内存泄漏的实时情况
运行程序打开jdk bin 文件夹下再带的 jconsole.exe,可以概览堆栈线程和装在类,内存的全部运行时间情况
下载安装mat , dump分析软件,安装后,点击file open 导入dump文件
打开后,灰色区域为可能发生内存溢出的区域,下带问题描述
选择Histogram , 点击shallow列进行排序,找出实例最多的
右键实例最的选择list objects-with incoming references,可在根据正则表达式输入自己想查的类,搜索,后右键打开 path to gc root-exclude phantom/weak/soft etc. references 就可以查出 调用为回收的相关信息 。
java内存泄漏怎么处理一、Java内存回收机制
不论哪种语言java代码检查内存泄漏的内存分配方式,都需要返回所分配内存的真实地址 , 也就是返回一个指针到内存块的首地址 。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的 。GC为java代码检查内存泄漏了能够正确释放对象,会监控每个对象的运行状况 , 对他们的申请、引用、被引用、赋值等状况进行监控 , Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题 。在Java语言中,判断一个内存空间是否符合垃圾收集标准有两个:一个是给对象赋予java代码检查内存泄漏了空值null,以下再没有调用过 , 另一个是给对象赋予了新值,这样重新分配了内存空间 。
二、Java内存泄露引起原因
推荐阅读
- 快手直播记录如何查询微信,微信怎么看快手直播回放
- jsfor循环下一循环,jsx for循环
- html5+语音输入唤醒,html语音播报功能
- cpu辅助电源是什么,cpu辅助电源是什么东西
- mysql怎么分类 mysql怎么分类查询
- 苹果手机怎么退款流程图,苹果手机上怎么退款退款流程图
- 企业如何做网络营销策划,企业如何做网络营销策划方案
- thinkphp模板去小数点,thinkphp去掉indexphp
- c语言swap函数交换 c语言swap函数交换数组