《JAVA中的基本数据类型和引用基本类型区别》涉及到的JVM
静态代码块的详细执行过程
详解JVM内存划分
Java自带的bin目录下的 jconsole.exe工具可以查看Tomcat的默认垃圾回收器
一、内存结构
1.1、Java内存分配图
1.2、方法区
方法区是一个规范,他的实现在JDK1.7之前是叫“永久代”,JDK1.8后叫“元空间”。
作用:用来存储类对象,类加载器,静态变量,StringTable,SymbolTable,即时编译器生成的代码等。
1.3、虚拟机栈(线程私有)
1.3.1、作用:
1.3.1.1、栈的大小 = 一个线程使用的内存大小
1.3.1.2、一个线程调用方法一次产生一个“栈帧”,一个“栈帧”包括方法的参数、局部变量等。多个“栈帧”成为“栈”。而正在执行的方法称为“活动栈帧”,一个线程内同一时刻只能有一个“活动栈帧”。
1.3.2、具体设置参数
-Xss
The default value depends on the platform:
- Linux/x64 (64-bit): 1024 KB
- macOS (64-bit): 1024 KB
- Oracle Solaris/x64 (64-bit): 1024 KB
- Windows: The default value depends on virtual memory
例如:-Xss2M
1.3.3、特点
1.3.3.1、方法执行完,“栈帧”就被立即释放。
1.3.3.2、因为线程私有,不存在共享,所以线程安全
1.3.4、什么情况下会使栈空间溢出?
1.3.4.1、方法的嵌套很深,一直到栈内存溢出(栈帧太多)
1.3.4.2、方法内局部变量太多(栈帧太大)
1.3.5、具体例子如下:
public class Demo1 {
private static int count = 0;
public static void main(String[] args) {
method1();
}
private