Java内存泄漏
2020-12-22 08:27
标签:nts 描述符 array 大量 ons 静态 lombok 生命周期 out 内存泄漏: 存在一些被分配的对象,满足两个特点: 结果:消耗越来越多的内存资源,最终导致 与C++的区别: 示例: 对象可以分为两种:有引用的对象和无引用的对象。 注:通过 几种常见的泄漏情景: 示例: 使用非static域存放对象: 解决对策: 示例: 解决对策: 注:未关闭的流会导致两种类型的泄漏 解决对策: 与未关闭的流类似。 解决对策: 当一个对象没有重写 解决方法 参考: Java内存泄漏 标签:nts 描述符 array 大量 ons 静态 lombok 生命周期 out 原文地址:https://www.cnblogs.com/truestoriesavici01/p/13217318.htmlJava内存泄漏
解释
OutOfMemoryError
。
Vector v = new Vector(10);
for(int i = 0; i
其中无引用的对象由GC进行回收。
有引用的对象不会被GC回收,即使这些对象不会再被使用。
Java堆泄漏
-Xms
和-Xmx
设置堆的最小值和最大值,使得容易的重现堆泄漏。存储对象引用的静态域
// JVM参数设定:-Xms10m -Xmx10m
// 会出现OutOfMemoryError
private Random random = new Random();
public static final ArrayList
// 不会出现OutOfMemoryError
@Test
public void test() throws InterruptedException {
addelement();
System.gc();
Thread.sleep(10000);
}
private void addelement(){
ArrayList
static
变量,其生命周期与JVM的生命周期相同。对长字符串使用
String.intern()
@Test
public void test() throws InterruptedException, FileNotFoundException {
Thread.sleep(15000);
String str = new Scanner(new File("scr/test.txt"),"UTF-8").useDelimiter("\\A").next();
str.intern(); // 向字符串常量池中加入长字符串
System.gc();
Thread.sleep(16000);
}
String.intern()
方法将字符串存储在永久代空间中,若需要将大量长字符串存入字符串常量池,可通过最大永久代大小来避免异常:-XX:MaxPermSize=
。String.intern()
不会导致异常。未关闭的流
// 流在使用后没有被关闭
@Test
public void test() throws IOException {
String str = "";
URLConnection conn = new URL("http://norvig.com/big.txt").openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
while (br.readLine() != null)
str += br.readLine();
}
// 无需在finally中手动关闭
try (BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
// ...
} catch (IOException e) {
e.printStackTrace();
}
未关闭的连接
一般是连接数据库或FTP后未关闭。// 连接FTP后未关闭
@Test
public void test() throws IOException {
URL url = new URL("ftp://speedtest.tele2.net");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream();
String str = " ";
}
将没有
hashCode()
和equal()
的对象加入到Hashset
中hashCode()
和equals()
方法时,在向HashSet
集合类中添加重复的对象时,其不会忽略到重复的对象。@Test
public void test(){
Map
equals()
和hashCode()
方法。
查找泄漏源
-verbose:gc
。
下一篇:常用排序算法