(1)Test.java --> javac --> Test.class --> java Test
(2)Test.java --> javac --> Test.class --> Mall.jar --> java -jar Test.jar
(3)Test.java --> javac --> Test.class --> Test.war --> Tomcat --> startup.sh --> org.apache.catalina.startup.Bootstrap
总结起来,运行一个java程序都是通过JDK下面bin/java启动一个JVM虚拟机,在虚拟机里面运行Test.class
(1)线程共享有堆和元空间(方法区),有线程安全问题
(2)其他为私有(虚拟机栈,本地方法栈,程序计数器),没有线程安全问题
public class StackTest {
private int stackDeep = 1;
public void deepAddOne(){
stackDeep++;
deepAddOne();
}
public static void main(String[] args) {
StackTest stackTest = new StackTest();
try {
stackTest.deepAddOne();
}catch (Throwable e){
System.out.println("stackDeep = " + stackTest.stackDeep);
throw e;
}
}
}
和虚拟机栈基本一样
虚拟机栈和本地方法栈和程序计数器随线程而生,随线程而灭,不需要GC
这部分是第三期JVM学习分享,欢迎大家讨论学习分享,你的三连是我最大的动力,第四期会马上出哦,敬请期待