在虚拟机系列二的时候已经以一个常见的异常作为切入了解了异常的出现的原因,那么在实际开发中怎么样去定位OutOfMemoryError出现的原因,然后找到解决办法呢?
可以使用一个参数-XX:+HeapDumpOnOutOfMemoryError
这个参数可以在运行时出现OutOfMemoryError异常的时候生成一个快照,有了快照,自然就可以查看快照数据,定位问题了。实际演练一下,
还是如下代码:
不断创建对象导致内存溢出
配置参数:
生成快照文件配置
控制台异常信息
抛出异常后可以看到在工作目录中生成了一个.hprof文件,
直接使用memory analyzer打开这个文件即可查看信息
memory analyzer面板
从面板可以看出,深色的就是问题的所在了:
按照如图的操作,就可以看出,OutOfMemoryError是由于创建了大量的StringBuffer对象导致对象再也申请不到内存空间而抛出了异常。找到问题的结症,自然就可以解决或者是优化问题了。
前面还说过一种由线程请求的栈深度大于虚拟机所允许的最大栈深度引起的StackOverflowError异常。可以用如下代码给大家演示一下:
StackOverflowError异常代码
运行之后:
由此可见,在单线程的情况下,如论是栈帧太大,就会抛出StackOverflowError异常。反指,当虚拟机栈容量太小时,也会抛出该异常