这个是我在B站学习的笔记记录。有可能会有不正确的地方。
- 栈内存溢出:栈内存溢出的情况有两种,第一种是栈帧过多导致,第二种是栈帧多大。
今天主要演示一下栈帧过多导致出现内存溢出的情况。执行如下的代码块:
我们递归调用method这个方法并且没有结束条件。运行结果为:private static int count = 0; public static void main(String[] args) { try { method(); } catch (Exception e) { e.printStackTrace(); System.out.println("======"+count); } finally { System.out.println("--------"+count); } } private static void method(){ count++; method(); }
会发现一直执行可23359次method方法,接下来我们手动将栈内存的大小调整小一点(-Xss是用来调整栈内存的大小)。

然后在执行一次上面的代码
- cpu占用过高分析
有如下一段代码,启动了一个线程然后执行死循环:
将代码部署到Linux系统中去(这个步骤csdn中有很多就不写了) ,然后执行java -cp TestClass.jar 包名+TestClass
然后执行top命令查看系统的cpu占用率,会发现cpu的占用率特别高
或者执行ps H -eo pid,tid,%cpu | grep 23492命令查看
然后执行 jstack 23492命令,同时将23502这个转换成16进制的数据5BCE,会发现线程的状态处于RUNABLE,同时cpu占用率高的具体原因是TestClass这个类的第10行代码,检查第10行代码发现,正是while死循环。则问题解决。
栈内存溢出与CPU占用分析
本文通过实例演示了栈内存溢出的原因之一:栈帧过多,并通过调整栈内存大小观察其影响。同时,分析了一段导致CPU占用过高的死循环代码,展示了如何使用jstack命令定位问题。
852

被折叠的 条评论
为什么被折叠?



