博客
关于我
JVM虚拟机深入理解----堆/栈/方法区中泄露和溢出
阅读量:705 次
发布时间:2019-03-17

本文共 1484 字,大约阅读时间需要 4 分钟。

1.堆内存溢出:

修改JVM参数:-Xms20m  -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

package cn.mxl.heap;import java.util.ArrayList;import java.util.List;public class OomHeap {	public static void main(String[] args) {		List list=new ArrayList();		while(true) {			list.add(new Test());		}	}}class Test{}

运行结果:

解决办法:

1.修改JVM参数,扩大堆内存 ;

2.通过Jconsole进行内存分析或者使用Eclipse Memory Analyzer,然后找到泄露的对象,进行处理;

这里要注意一下:内存泄露(memory leak)和内存溢出(memory overflow),笔者的理解是,第一个是在使用过程中因为不够,导致的异常,一个是线程申请的时候内存不够所抛出的异常,其中笔者个人觉得没有多大意义去区分它,我们分析方法和解决办法还是上面那两种;

2虚拟机栈和本地方法栈溢出

测试代码:

package cn.mxl.stack;public class JavaVMStack {	private  int test=1;	public  void stackLeak() {		test++;		stackLeak();	}	public static void main(String[] args) {		// TODO Auto-generated method stub		JavaVMStack javaVMStack=new JavaVMStack();		try {			javaVMStack.stackLeak();		} catch (Throwable e) {			// TODO: handle exception			System.out.println("test:"+javaVMStack.test);			e.printStackTrace();		}	}}

运行结果:

首先笔者还是想解释一下,这里为什么会出现栈溢出StackOverflowError的异常;首先那个int test笔者的目的只是观察被执行了几次这个方法,读者千万别以为和栈溢出有什么关系,栈溢出主要是由于栈帧太大导致的溢出,而我们的方法调用都保存在栈帧中,所以当我们不断的循环调用方法的时候,就会出现栈帧太大,导致栈溢出报Stack Overflow的异常.

栈的溢出可能会让我们想到递归,因为递归是很容易导致线程溢出的(还有多线程的情况下),那我们又该如何解决栈溢出呢?

1.传统的方式,减少不必要的线程数,或者增加虚拟机内存;

2.实际的方式,因为虚拟机内存是被heap和stack两个来平分的(这里不可能那些其他的占用虚拟机内存的区域),所以减少heap的内存,从而间接的增加stack的内存;

3.方法区和运行时常量池溢出

在之前jdk1.7的时候,通过String.intern()方法可以使得方法区溢出,但是如今String的常量池在1.8之后放到堆内存中,导致笔者也暂时没有想到哪个程序能够使得方法区溢出;

笔者只能提供一下一旦方法区溢出的解决办法:

1.排查,然后修改代码;

2.设置方法区内存值;

 

笔者在这里省略了一个本机直接内存溢出,想了解的可以去网上单独看看.

转载地址:http://zubhz.baihongyu.com/

你可能感兴趣的文章
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>