JVM内存溢出及死锁定位及分析


Eclipse Memory Analyzer或者JProfiler)工具进行定位分析。
内存溢出与内存泄露

  • 内存溢出,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
  • 内存泄露,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

GitHub这个网址上找到与你jdk版本相对应的url。
jdk8可以用:https://visualvm.github.io/archive/uc/7u60/updates.xml.gz

然后就可以正常搜索插件

2)编写测试代码

/**
 * VM Args: -Xms5m -Xmx5m -XX:+HeapDumpOnOutOfMemoryError
 *
 * @author: dvomu
 * @create: 2022-03-26
 */
public class TestHeap {
    public static void main(String[] args) {
        List userList = new ArrayList<>();
        while (true) {
            User user = new User();
            user.setId(1L);
            user.setUsername("user");
            user.setPassword("pass");
            if (System.currentTimeMillis() % 2 == 0) {
                //加入到集合,不符合条件的就成了垃圾对象 
                userList.add(user);
            }
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
@Data
class User{
    private Long id;
    private String username;
    private String password;
}

3) 设置运行参数

启动应用。

4)查看Visual GC

可以看到,年轻代、老年代中的内存使用情况,运行一段时间后观察效果更佳明显。
当老年代满了后就会报OOM异常

JVM