博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java内存管理
阅读量:7071 次
发布时间:2019-06-28

本文共 1682 字,大约阅读时间需要 5 分钟。

hot3.png

简述

前一段时间粗略看了一下《深入Java虚拟机 第二版》,可能是因为工作才一年的原因吧,看着十分的吃力。毕竟如果具体到细节的话,Java虚拟机涉及的内容太多了。可能再过一两年去看会合适一些吧。

不过看了一遍《深入Java虚拟机》再来理解Java内存管理会好很多。接下来一起学习下Java内存管理吧。

输入图片说明

请注意上图的这个:

输入图片说明

进程与线程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

似乎现在更好理解了一些:

方法区和堆是分配给进程的,也就是所有线程共享的。

而栈和程序计数器,则是分配给每个独立线程的,是运行过程中必不可少的资源。

栈、堆、方法区和程序计数器、本地方法

1、方法区(Method Area)

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

2、程序计数器(Program Counter Register)

程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

下面重点解下Java内存管理中的栈和堆。

3、栈(Stacks)

在Java中,JVM中的栈记录了线程的方法调用。每个线程拥有一个栈。在某个线程的运行过程中,如果有新的方法调用,那么该线程对应的栈就会增加一个存储单元,即帧(frame)。在frame中,保存有该方法调用的参数、局部变量和返回地址。

Java的参数和局部变量只能是基本类型的变量(比如int),或者对象的引用(reference)。因此,在栈中,只保存有基本类型的变量和对象引用。引用所指向的对象保存在堆中。(引用可能为Null值,即不指向任何对象)。

当被调用方法运行结束时,该方法对应的帧将被删除,参数和局部变量所占据的空间也随之释放。线程回到原方法,继续执行。当所有的栈都清空时,程序也随之运行结束。

本地方法栈与虚拟机栈的区别:

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

##4、堆(Heap)

堆是JVM中一块可自由分配给对象的区域。当我们谈论垃圾回收(garbage collection)时,我们主要回收堆(heap)的空间。

Java的普通对象存活在堆中。与栈不同,堆的空间不会随着方法调用结束而清空。因此,在某个方法中创建的对象,可以在方法调用结束之后,继续存在于堆中。这带来的一个问题是,如果我们不断的创建新的对象,内存空间将最终消耗殆尽。

链接

转载于:https://my.oschina.net/u/3421984/blog/1801700

你可能感兴趣的文章
如何实现类似微信朋友圈的feed功能(第一版)
查看>>
安装NODEJS的三种方法
查看>>
如何让Mac完全读写NTFS格式分区
查看>>
百万级很快的分页联合
查看>>
手机内存卡修复工具软件大师免费试用版
查看>>
获取屏蔽符号<!-- -->屏蔽的字符串的代码
查看>>
struct和typedef struct
查看>>
Notification启动Activity, 恢复任务栈
查看>>
使用Python进行并发编程
查看>>
自动机器学习简述(AutoML)
查看>>
iPhone X适配
查看>>
虚拟化笔记
查看>>
[vim]-vim基础
查看>>
JAVA 8入门(一)Lambda表达式
查看>>
resin集成eclipse开发
查看>>
将Excel文件中的数据导入到mysql【Excel中拼sql】
查看>>
H5移动端知识点
查看>>
【js与jquery】网站更换皮肤功能
查看>>
Ubuntu ssh连接root验证错误
查看>>
C语言内存管理(初级)----链表
查看>>