JVM区域划分

 

JVM的区域划分主要包括以下部分:

  1. 方法区

  2. 程序计数器

  3. 虚拟机栈

  4. 本地方法区

    在上述的几个部分里,堆和方法区是线程共享的,也就是说一个JVM虚拟机里出的一个公共的区域,所有的线程共享这块的资源和空间(动态不固定),这块是随着JVM虚拟机或者GC的创建和销毁。而程序计算器、虚拟机栈、本地方法区这几个部分都是线程独占的,随着线程的创建而创建,随着线程的销毁而销毁(具有确定性)。下面在对各个具体的区域进行解释。

程序计数器

jvm真正执行的是字节码,而不是我们平常编写代码中的.java文件。可以通过javac将.java文件编译成.class文件。然后我们可以通过javap -v XXX.class > XXX.txt指令查看具体的操作符(将指令集转换正操作符,方便人查看)。在执行字节码中,JVM中的程序计算器的作用是什么呢?程序计算器的作用就是记录每一个线程当前执行的字节码的位置,也就是说当前线程执行到字节码中的那一条指令。 如果执行的是Native方法,则计数器值为空。CPU同一时间,只会执行一条线程中的指令。JVM多线程会轮流切换并分配CPU执行时间的方式,线程切换后,就可以通程序计数器来确保被切换前的指令能够继续正确执行。

Java虚拟机栈

每个线程会在该空间开辟一个线程私有的空间,一个线程会执行一个或多个方法,而每一个方法则会对应一个栈帧,多个栈帧就会组成线程栈。每个栈帧就对应一个方法里面的局部变量、操作数据、动态链接、方法出口等数据。栈内存的默认最大空间为1M,超出则会抛出StackOverflowError.(栈是一种先入后出的数据结构,可以理解为类似的手枪的弹夹

Java堆内存

Java堆是在用存放在程序中创建的各种对象的,比如我们通过new 关键字进行对象创建时,就会把这个对象以及这个对象自身的一些属性数据 放在java堆内存中。

假如有以下代码:

public void personSayHello(String name){  
       Person p = new Person(name);       
     p.sayHello(name);    
}

 

这个例子中分别有P Person对象以及sayhello()方法,其中new 出来的Person对象就放在了Java的堆内存中。然后方法的帧栈局部变量里,p的局部变量就是Person对象的对内存地址。 此时这个方法中分别执行了两部分,一个是在Java虚拟机栈中创建了personSayHello()的栈帧,以及在java的堆内存中创建了一个Person对象。

方法区(元数据区即Metaspace)

主要存放的类的信息,也叫做永久代。在JDK1.8以后就改名叫Metaspace,也叫做元数据空间。

本地方法栈

在JDK中的许多底层操作,比如线程的阻塞、发送SOCKET等等相关,这部分的实现去调用操作系统里面的一些方法,在调用这种native方法的时候,就会有线程对应的本地方法栈,类似于java虚拟机栈,用来存储各种native方法的局部变量等相关信息。

转载于:https://www.cnblogs.com/enjoyitlife/p/11143123.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值