「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
前言
大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍Java中的内存划分的五大块。
Java中的内存划分
1. 虚拟机栈(Stack)
JVM栈是每个线程私有,存储的是方法内的局部变量。每执行一个方法时JVM都会创建一个对应的栈帧,用来存储局部变量,操作数栈等信息。方法就在栈中运行。 方法执行时栈帧进栈,方法执行结束时,栈帧出栈。当线程结束时,栈就被销毁。
2. 堆(Heap)
凡是new出来的东西都在堆中。并且堆中的东西都有一个16进制的地址值,堆中的每个数据都有对应的的默认值,堆是JVM所管理的内存中的最大的一块内存,被所有线程所共享。并且垃圾回收的主要区域就是堆。
每一个JVM都对应一个堆,一个程序的多个线程共享一个堆。
3. 方法区(Method Area)
方法区用来存储class二进制文件,即包含了类的所有信息(类信息,静态变量,方法,常量和普通方法等),同样被所有线程所共享,但同时是线程安全的。当有多个线程访问一个类时,如果这个类还没有被装入JVM,那么只能有一个线程去加载这个类,其他线程必须等待。
因为常量池也在方法区中,所以方法区大小也是动态可变的。方法区也具有垃圾回收机制。
4. 本地方法栈(Native Method Stack)
本地方法栈和操作系统相关。和JVM栈基本类似,主要区别就是:
- 本地方法栈是为JVM执行Native Method。
- JVM栈是为JVM执行Java方法。
定义Native Method时并不提供方法的实现体,方法的实现体是由非Java代码实现的。实际上Native Method方法就是一个Java调用非Java代码的一个接口。JVM通过这个接口来调用本地方法库实现和操作系统,Java外部环境进行交互。
5. 程序计数器(PC)
了解过操作系统的都应该知道,程序计数器(PC)中保存着程序执行的下一条指令,就相当于程序的指示器。
对于Java来说,每个线程执行时,都会有一个独立的PC来保存下一条指令执行的地址,各个线程之间互不影响。
结语
以上就是我对Java中内存划分的一些浅见,如有不正之处,欢迎掘友们留言指正。