JVM内存结构图
大家好,好几天没有更新了,今天的内容有点多,我们详细介绍下JVM内部结构图,还是和之前一样,案例先行,方便大家理解记忆。
/**
* @author :jiaolian
* @date :Created in 2021-03-10 21:28
* @description:helloworld测试jvm内存区域
* @modified By:
* 公众号:叫练
*/
public class HelloWorldTest {
public static void main(String[] args) {
//新建HelloWorldTest对象;
HelloWorldTest helloWorldTest = new HelloWorldTest();
//新建2个线程调用sayHello
for (int i=0; i<2; i++) {
new Thread(()->helloWorldTest.sayHello("world")).start();
}
}
/**
* 对某人说hello
* @param who
*/
public void sayHello(String who) {
System.out.println(Thread.currentThread().getName()+"hello!"+who);
}
}
如上代码:在主线程中for循环新建2个线程调用sayHello,最后两个线程分别对世界问好!这段代码比较好理解,就不贴输出结果了。我们编写并运行了这段代码,我们主要看看这段代码在JVM中是怎么运作的。
首先,我们编写一个HelloWorldTest.Java文件,经过javac编译会转化成字节码HelloWorldTest.class,为什么要转化成字节码呢?因为Java虚拟机能识别!最后由类加载子系统ClassLoader将字节码装载到内存。每块内存各有自己的作用,最后由执行引擎来执行字节码。下面我们重点介绍下各块内存发挥的作用!
方法区
方法区主要装一些静态信息,比如:类元数据,常量池,方法信息,类变量等。如上代码HelloWorldTest.class是类元数据,sayHello,main都是方法信息等都是放在方法区存储的。方法区中还需要注意两点:
- 如果方法区太大,超过设置,会报OutOfMemoryError:PermGen space错误。gclib工具可以动态生成类测试该错误。