这个是我在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死循环。则问题解决。