如何用Java编写一段代码引发内存泄露

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Java编写一段代码引发内存泄露相关的知识,希望对你有一定的参考价值。

1、首先得搞清楚什么叫内存泄露,简单来说就是一个东西放在内存里的时间太长了,当你的程序都跑完了,它还存在那里。这时它是白白的占用了你的内存,累积起来占用的内存越来越多……最后就会导致JVM报错:out of memory。
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);


参考技术A 静态变量引用对象

1
2
3
class MemorableClass
static final ArrayList list = new ArrayList(100);

调用长字符串的String.intern()

1
2
3
String str=readString(); // read lengthy string any source db,textbox/jsp etc..
// This will place the string in memory pool from which you cant remove
str.intern();
未关闭已打开流(文件,网络等)

1
2
3
4
5
6
7
try
BufferedReader br = new BufferedReader(new FileReader(inputFile));
...
...
catch (Exception e)
e.printStacktrace();

未关闭连接

1
2
3
4
5
6
7
try
Connection conn = ConnectionFactory.getConnection();
...
...
catch (Exception e)
e.printStacktrace();

JVM的GC不可达区域

如何用pycharm编写获取时间的代码

作者:Light Lin
链接:https://www.zhihu.com/question/37787004/answer/75269463
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

JetBrains家的IDE很多技巧是通用的,说一些自己日常用得多但不一定仅限于PyCharm的技巧:

`ctrl+alt+L`,格式化代码,曾经用Eclipse的时候,格式化代码一定要先选中某个区域的代码块再进行格式化,用了JetBrains的IDE之后就习惯性地格式化一下,还必须手贱多格式化几次才舒服,不过有后遗症,以后到各种编辑框中总喜欢`ctrl+alt+L`几下才舒服

`alt+enter`万能键,不同场景有不同的表现方式,在还没import(install)模块名上使用会import(install)相对应的模块,在方法名上使用补注释,在测试中使用帮你补充断言代码……不管出错了不知道怎么办,知道怎么办想这么办时都按下这个快捷键,有惊喜

`ctrl+space` 万能提示键,非静态语言不太容易做提示,PyCharm的会根据上下文提供补全。不仅是代码提示,`ctrl+f`搜索的时候,不知道该键入啥时就按下,经常给人惊喜。在windows下由于输入法无法使用这个快捷键,`ctrl+alt+s`打开设置键入 keymap,在Keymap中搜索basic可以找到并修改它

`ctrl+shift+f10`运行当前文件,十分智能,如果是测试代码,则以测试模式run,并列出测试通过情况。

`ctrl+w`扩展选取和`ctrl+shift+w`缩减选区,根据当前层级一层一层向上伸展选中区域,例如value ->key:value -> dict -> ... ,每按一次就扩展一级,`ctrl+shift+w`用来取消上一次的扩展选取操作,注意后遗症,大部分软件中的`ctrl+w`是关闭!是`ctrl+shift+箭头`而不是`ctrl+w`

`ctrl+q`查注释

`ctrl+shift+i`没注释时查源码

`ctrl+p`调用方法时查看参数,在括号内按下,就知道当前位置该给啥参数,不过由于是Python,这里使用`ctrl+space`也可以达到很好的效果

`shift+enter`另起一行,光标在行内任意位置都能另起一行,且不破坏当行结构

`ctrl+alt+enter`向上另起一行

`ctrl+shift+数字键`与`ctrl+数字键`书签功能

`ctrl+shift+a`搜索IDE功能,比如想看看这个文件的历史,就键入history 可以找到 Local history

双击`shift`搜索一切,不管是IDE功能、文件、方法、变量……都能搜索

各个窗口下,无论是Project,Setting,Debugger...都可以直接键入想要搜索的内容,它会帮你高亮

内置的REPL,由于JetBrains的加成可以实现很多与编辑器内相同的效果

内置Git,通过插件可以支持 Git flow,十分优秀的代码对比,merge时解决冲突很有帮助

Local history,文件夹,每个文件都有记录历史版本

Tip of the day,总会给人带来一些有用的小功能 ,别嫌烦就给关了啊

内置source code pro字体+Darcula Theme(暗色主题) ,眼不疼了

固态硬盘,配合JetBrains碉堡的索引,虽然没什么关系
参考技术A 杀阴曹《斩阎罗》:叹世路风波,看人事蹉跎,忘不了镇江明月夜,望剑合掌会冤娥,英雄歌,情难却,一腔心事听谁说,且守着哥哥,把宝剑新磨,再带你回冥斩阎罗。

以上是关于如何用Java编写一段代码引发内存泄露的主要内容,如果未能解决你的问题,请参考以下文章

如何用windbg分析内存泄露

如何用VS工具检测内存泄露

JS中由闭包引发内存泄露的深思

Todo转载Java中如何写一段内存泄露的程序

C++ 关于内存泄露问题。内存泄露是指用new 分配的内存没有用delete释放,如果未释放会有啥后果?

JAVA中内存泄露和内存溢出