java实时获取堆内存 JAVA的内存是如何划分的?

[更新]
·
·
分类:互联网
1928 阅读

java实时获取堆内存

JAVA的内存是如何划分的?

JAVA的内存是如何划分的?

谢邀~
关于JVM的知识,一直令很多Java程序员头疼,不过JVM也是值得我们深入学习的内容,下面我就谈谈自己对JVM内存划分的理解。
什么是Java的内存学习Java的朋友应该都知道,Java程序是在JVM上运行的,所以我们一般谈的Java内存划分事实上都是指的JVM内存区域的划分。在讨论JVM内存划分之前,我们需要知道Java程序的执行过程(手动画图,有点儿丑):
通过这个图可以看到,JVM在执行Java程序的时候,要用到一块空间来存储运行期间用到的数据,这块区域就是我们经常用的运行时区域,也就是常说的JVM内存。
Java的内存的组成程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。
这个是Java虚拟机规范规定好的,但是具体怎么实现还是由厂商决定的。
运行的时候,每一个区域存的是什么数据的,先看一张图:
程序计数器保存指令地址,也就是存的是下一条执行所在的存储地址。如果是多线程的时候,因为一个CPU在一个时刻只能执行一条命令,为了能够让每一个线程在切换之后能够恢复切换之前的位置,每个线程就需要有自己的计数器,所以说:程序计数器是每个线程私有的。
虚拟机栈
就是Stack,存放的是一个个的栈帧,每个栈帧对应一个被调用的方法。在栈帧中存着局部变量表、操作数栈、指向当前方法所属的类的运行时常量池的引用、方法返回地址和一些额外的附加信息。(这几个东西都是干啥的,可以单独写篇文章说了...)
每个线程都会有一个自己的Java栈,也是线程私有的。
本地方法栈
本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。
在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。堆
存储对象本身的以及数组,堆是被所有线程共享的,在JVM中只有一个堆。
方法区
存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等,也是被线程共享的。
Java内存区域划分,是一个中高级程序员的必修课,希望我的回答能够帮助到你!
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

在Java里堆内存和栈内存有什么区别?

这个来自于古老的C语言概念,凡是在函数中用基本数据类型(string除外)申请的局部变量,也就是函数退出则这些变量就消亡的变量,包括函数自己的参数定义,都用栈内存的方式构造内存,这样做的目的是进入该函数、变量值进栈,函数退出自动退栈,这样就自动完成了内存申请和回收,这些栈空间的变量只能被该函数自己引用,其他函数不能引用。
而C语言的全局变量、JAVA的对象,也就是说如C语言用malloc()函数,C 、JAVA等用new构造的对象,都在堆方式组织的内存中,这样的目的是让很多函数都能引用到这些存储空间的值或者对象。存储在堆空间的对象和数据,需要编程者按需要释放,如C语言用free(),C 则要析构函数,Java就有自动回收机制。
随手写的,有错勿喷。