JBoss AS

一次奇怪的StackOverflowError问题查找之旅

橙三吉。 提交于 2019-11-27 10:37:22
一次奇怪的StackOverflowError问题查找之旅 公司最近买了一套老代码,在测试环境部署的时候发生了 nested exception is java.lang.StackOverflowError 的异常,当时看到这个异常首先想到是栈内存溢出,网上给出的解决办法就是加栈内存大小就行。趁着这个机会也了解一下什么是Java虚拟机栈。 Java虚拟机栈 我们想要解决 StackOverflowError 问题就得了解其内部工作机制,首先我们需要了解Java虚拟机栈是什么。了解Java虚拟机栈之前我们先看一段代码。 public class TestStack { public static void main(String[] args) { a(); } public static void a(){ int a = 10; b(); } public static void b(){ int b = 10; } } 上面的一段代码非常简单,整体流程就是 先执行main()方法 执行main()方法调用的a()方法,并且赋值a=10 执行a()方法调用的b()方法,并赋值b=10 现在让我们了解上面一段简单流程情况下栈的动作流程,首先我们需要知道栈是每个线程独有的,而存放在栈里面的叫做栈帧,每进入一个方法就会有一个栈帧入栈的动作,即下面的黄色方块就是栈帧

Java代码编译和执行的整个过程

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-27 06:55:22
Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Java 源码编译由以下三个过程组成: 分析和输入到符号表 注解处理 语义分析和生成class文件 流程图如下所示: 最后生成的class文件由以下部分组成: 结构信息。包括class文件格式版本号及各部分的数量与大小的信息 元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池 方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息 类加载机制 JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述: 1)Bootstrap ClassLoader 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类 2)Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext