在java虚拟机规范中,虚拟机栈和本地方法栈都会出现StackOverflowError和OutofMemoryError,程序计数器是java虚拟机中唯一一块不会产生error的内存区域。

一、StackOverflowError(栈溢出)

StackOverflowError代表的是,当栈深度超过虚拟机分配给线程的栈大小时就会出现此error。

在eclipse中增加jvm参数见《eclipse调试时增加jvm参数

示例1:

package com.dxz.jvm;

/**
* @Described:栈层级不足
* @VM args:-Xss128k
*/
public class StackOverFlow {
private int i; public void plus() {
i++;
plus();
} public static void main(String[] args) {
StackOverFlow stackOverFlow = new StackOverFlow();
try {
stackOverFlow.plus();
} catch (Error e) {
System.out.println("Error:stack length:" + stackOverFlow.i);
e.printStackTrace();
}
}
}

-vm args-Xss128k  :说明后面是VM的参数,所以后面的其实都是JVM的参数了

结果:

Error:stack length:997
java.lang.StackOverflowError
at com.dxz.jvm.StackOverFlow.plus(StackOverFlow.java:11)

示例2:

package com.dxz.jvm;

/**
* @Described:递归Constructer
* @VM args:-Xss128k
*/
public class StackOverFlow2 { public class OneObject {
OneObject oneObject = new OneObject();
} public static void main(String[] args) {
StackOverFlow2 stackOverFlow2 = new StackOverFlow2();
try {
OneObject oneObject = stackOverFlow2.new OneObject();
} catch (Exception e) {
e.printStackTrace();
}
}
}

结果:

Exception in thread "main" java.lang.StackOverflowError
at com.dxz.jvm.StackOverFlow2$OneObject.<init>(StackOverFlow2.java:10)

反编译代码:

package com.dxz.jvm;

public class StackOverFlow2
{
public static void main(String[] args)
{
StackOverFlow2 stackOverFlow2 = new StackOverFlow2();
try
{
StackOverFlow2 tmp13_12 = stackOverFlow2; tmp13_12.getClass(); OneObject localOneObject = new OneObject();
} catch (Exception e) {
e.printStackTrace();
}
} public class OneObject
{
OneObject oneObject = new OneObject(StackOverFlow2.this); public OneObject()
{
}
}
}

看下命令行:

说明:在这里  constructer 中是调用 init , 而 static 是调用 cinit , 固我们如果将自己的对象放入到 static 中是不会造成递归的, 而如果将自己本身放到 constructer 中他就会不断的调用 init ,递归并不是马上返回,而是一层一层的保存在Stack里边,满足结束条件后才一层一层的返回。

当Stack满了就抛出error了。 所以才发生了上面的java.lang.StackOverflowError 溢出错误。
注意:是递归的错误,才出现Stack满的情况,而无限循环一般不会占用更多的内存或者具体的Stack,只是占cpu而已,所以不会抛此错误。

JVM异常之:栈溢出StackOverflowError的更多相关文章

  1. 记一次jvm异常排查及优化

    为方便自己查看,根据工作遇到的问题,转载并整理以下jvm优化内容 有次接到客服反馈,生产系统异常,无法访问.接到通知紧急上后台跟踪,查看了数据库死锁情况--正常,接着查看tomcat 内存溢出--正常 ...

  2. 异常如果一直被throws抛出的话就会被jvm异常处理器处理了

    异常如果一直被throws抛出的话就会被jvm异常处理器处理了,这时jvm会跳出正常运行状态. 异常如果一直被throws抛出的话就会被jvm异常处理器处理了,这时jvm会跳出正常运行状态. 异常如果 ...

  3. JVM--你常见的jvm 异常有哪些? 代码演示:StackOverflowError , utOfMemoryError: Java heap space , OutOfMemoryError: GC overhead limit exceeded, Direct buffer memory, Unable_to_create_new_native_Thread, Metaspace

    直接上代码: public class Test001 { public static void main(String[] args) { //java.lang.StackOverflowErro ...

  4. JVM中OutOFMemory和StackOverflowError异常代码

    1.Out of Memory 异常 右键Run As --->Run Configuration 设置JVM参数 -Xms20m -Xmx20m 上代码: /** * VM Args:-Xms ...

  5. 小心sae的jvm异常导致的Error 404 – Not Found.No context on this server matched or handled this request.

    本来用着sae好好的,结果第二天部署的应用突然不好使了,各种Error 404 – Not Found.No context on this server matched or handled thi ...

  6. JVM异常之:方法区溢出OutOfMemoryError: PermGen space

    1.方法区溢出(Perm持久代溢出) 在jdk1.6及之前的版本中,常量池放在Perm区也即是方法区中,所以在jdk1.6版本中,常量池溢出可以说是方法区溢出. 示例一: 方法区溢出的示例见<J ...

  7. JVM异常之:堆溢出OutofMemoryError

    1.堆溢出 Java 堆内存的OutOfMemoryError异常是实际应用中最常见的内存溢出异常情况.出现Java 堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError” ...

  8. 在k8s中收集jvm异常dump文件到OSS

    现状 加参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/test.dump 可以实现在jvm发生内存错误后 会生成dump文件 方便开 ...

  9. JVM异常之:直接内存溢出

    示例: package com.dxz.jvm; import java.lang.reflect.Field; import sun.misc.Unsafe; /** * @Described:直接 ...

随机推荐

  1. linux 的压缩 打包

    1.压缩打包,常见的命令:gzip bzip2 xz zip tar gzip:  不能压缩目录 gip  -[0-9]  file_name   压缩级别, 默认是6 gzip  file_nane ...

  2. 03 事务,连接池DBCP,C3P0,DBUtils

    事务 Transaction  其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回归到最初的状态(回滚) 事务的作用:为了确保逻辑的成功. 例子: ...

  3. (18)模型层 -ORM之msql 多表操作(字段的属性)

    数据库表的对应关系 1.一对一   #关联字段写在那张表都可以 PS:只要写OneToOneField就会自动加一个id 2.一对多  #关系确立,关联字段写在多的一方 3.多对多   #多对多的关系 ...

  4. mysql export query result

    1 . export by shell a.sql use dbname; SELECT id,iab_num FROM iab_list ; mysql -h host -uusername -P3 ...

  5. 安装Centos7时提示 /dev/root does not exits

    安装centos 7时提示 "Warning: /dev/root does not exist, could not boot" 这个问题是木有找到你的U盘. 在一个能够编辑U盘 ...

  6. 新鲜出炉一份Java面试清单,共200+道题

    一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行jav ...

  7. Swagger2的使用及注意事项

    一.Swagger的主要作用有两方面: 1.生成在线文档,通过注解方式生成在线文档,方便在定义修正接口时直接修改接口文档: 2.对接口文档在线测试,不用在输入接口地址以及里面的参数对象,可以很方便的对 ...

  8. java对文件操作之实用

    创建文件 package com.pre; import java.io.File; public class WJ { public static void main(String[] args) ...

  9. optimization.splitChunks 中,chunks 的3个值:all、async、initial 的含义

    chunks 参数值 含义 all 把动态和非动态模块同时进行优化打包:所有模块都扔到 vendors.bundle.js 里面. initial 把非动态模块打包进 vendor,动态模块优化打包 ...

  10. ubuntu网络配置及端口名修改

    一.网络配置文件 buntu系统进行网络配置有的时候用图形界面不起作用,这种情况下可以直接修改某些启动脚本或配置文件 Ubuntu系统进行网络配置涉及到几个配置文件1./etc/network/int ...