Java基础(一):简单讲解JVM内存模型

笔者虽是科班出身,毕业自曼大计算机专业,但是对于Java的学习可以说几乎全部是靠自学的。想要学好Java,多多实践自然是王道,但是学会看书和看技术博文同样很重要。

从今天开始,我会经常更新Java博文,知识点涵盖基础语言知识源代码,虚拟机,高并发,框架等。一是为了自我复习,二也是希望能对于同样热爱Java的同学有所帮助。

考虑到在讲基础语言知识时会不可避免地聊到JVM的内存模型,也就是不同的数据类型会存放在那些逻辑内存区域,所以第一篇先讲讲JVM的逻辑内存模型。这一篇只是简单介绍内存模型,后续进入虚拟机部分会详细讲解。

1.程序计数器:这是一块容量很小的内存空间,它的作用简单来说就是指示目前线程的字节码执行到哪一行了。每条线程都拥有自己的程序计数器。很容易理解的是,Java中的多个线程,是在频繁地切换执行的,所以程序计数器就可以记录当这条线程切换回来时,接下来要执行哪一行字节码。 顺便说一句,什么是Java中的线程,这里不是重点,姑且简单讲两句,比如你写一个最简单的hello world程序,那它是一个程序。而一个程序中是可以有多个线程同时运行在多个CPU上的。

2.Java 虚拟机栈:Java 虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同,线程一结束,这个栈也就没了。虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。简而言之,虚拟机栈就对应着程序里的方法,方法里定义的变量则放在局部变量表中。

3.本地方法栈:同样是执行方法的,不过是native方法,也就是java底层已经封装好的方法,与我们平日里自己写代码没什么关系。

4.堆:堆是虚拟机中内存最大的一块,它的用处就是所有你在程序里创建的对象,都是放在堆里的。也是以后会讲到的垃圾回收的最主要区域。堆是线程共享的!

5.方法区:同样线程共享,用来放常量和静态变量还有加载的类信息。

6.运行时常量池:存放class文件中的字面量和符号引用。属于方法区的一部分。

7.直接内存:这个基本很少接触,是用于直接分配堆外内存的,暂时不做了解。

给你们来张简洁明了的图:

 

行了,内存模型简单先讲到这,后面深入虚拟机会详细讲的。

 

 

DedZec

11.06.18

-------The End-------

你可能感兴趣的:(Java自学日记)