一步一步学jvm-运行时数据区域

author author     2022-09-14     497

关键词:

程序计数器(Program Counter Register)

         像我们平时读书一样,当我们在去做别的事情之前,我们会对我们读到什么地方了做一个标记,方便我们再回来的时候接着重新读。如果这本书有很多人读呢?那么每个人都会对自己读到了哪里做一个标记。(标记都是个人自己保存)

         那么程序计数器也是一样的,同样的代码,可能会被多个线程执行,那么每个线程都要记住自己执行到哪行代码了。这样在线程再次切换执行的时候,知道代码接着从哪里执行。

         所以程序计数器是线程私有的,每个线程都会程序计数器。对于正在执行的Native方法,这个计数器值为空。

     虚拟机栈(VM Stack)

         与程序计数器一样,Java虚拟机栈也是线程私有的。每个线程执行的时候都会创建一个栈帧(Stack Frame)。用来存放局部变量表、操作数栈、动态链接、方法出口等信息。每个方法的调用到执行完成的过程,都对应着一个栈帧在虚拟机中入栈到出栈的过程。

  局部变量表

         局部变量表中存放了编译器可知的各种数据类型,和对象引用类型。其中除了64位长度的long和double类型会占用2个局部变量空间(Slot),其余的数据类型只占用1个。所以每个方法需要分配多大的局部变量表空间是完全确定的,在编译期间就完成分配。在方法运行期间不会发生改变。

本地方法栈(Native Method Stack)

         与虚拟机栈一样,只是虚拟机栈是为虚拟机执行的Java方法服务,而本地方法栈为虚拟机中使用到的Native方法服务。

       Java堆,是被所有线程共享的区域,在虚拟机启动时创建。用来存放对象示例。

  随着对象的创建,Java堆中的对象实例会越来越多,会造成内存溢出。在这些对象中,有百分之八十都是使用完之后就不用了,所以我们可以对这些对象进行回收。就引出了垃圾回收机制,对堆中没用的对象进行清理。为了方便对象清理,又把堆分为了新生代和老年代。其中新生代又可以详细分为Eden区、From Survive区和To Survive区。

方法区  

         在方法区存储了类的信息,静态变量、常量等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它有一个别名Non-Heap(非堆),目的是为了和Java堆区分开。

         在HotSpot虚拟机上,方法区也被称为“永久代”,这与Java虚拟机的垃圾回收有关。但是这样设计并不好,更加容易导致内存溢出问题。HotSpot虚拟机现在也有放弃永久代并逐步改为采用Native Memory来实现方法区的规划。从JDK1.7的HotSpot中,已经把原本在永久代的字符串常量池移出。

 运行时常量池

         运行时常量池也是方法区的一部分。用来存放编译器生成的各种字面量和符号引用。Java语言并不要求常量池一定只有编译器才能产生,运行期间也可能将新的常量放入池中。利用的最多的就是String的intern()方法。

直接内存

         直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。但是这部分内存被频繁使用,也可能导致内存溢出异常出现。      

 

一步一步学jvm-垃圾回收器

Serial收集器        Serial收集器是最基本、历史最悠久的收集器。这个收集器是一个单线程的收集器。它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。Serial收集器是新生代的收... 查看详情

一步一步学jvm-垃圾回收算法

标记-清除算法        算法分为标记和清除两个阶段:首先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象。        该算法存在的缺点:  1、 ... 查看详情

一步一步学jvm-java内存模型

主内存与工作内存        Java内存模型的主要目标是定义程序中各个变量的访问规则。即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。这里的变量和Java编程中所说的变量有所区... 查看详情

一步一步学多线程-synchronized

  当线程执行请求synchronized方法或块时,monitor会设置几个虚拟逻辑数据结构来管理这些多线程。      请求的线程会首先被加入到线程排队队列中,线程阻塞,当某个拥有线程锁的线程unlock之后,则排队队列里的线程... 查看详情

一步一步学vue

接上篇,这次是真的接上篇,针对上篇未完成的部分,增加鉴权功能,开始之前,我们先要介绍一个新的知识,路由元数据。 在vue-router中,定义元数据的方式:constrouter=newVueRouter({routes:[{path:‘/foo‘,component:Foo,children:[{path:... 查看详情

一步一步学rendermonkey

http://blog.csdn.net/tianhai110/article/details/5668832 转载请注明出处:http://blog.csdn.net/tianhai110/ 网上一些关于renderMonkey的教程:《RenderMonkey的基本使用方法》http://www.cnblogs.com/mixiyou/archive/2009/10/05/ 查看详情

一步一步学j2se-concurrenthashmap原理

  ConcurrentHshMap的数据结构是由一个Segment数组和多个HashEntry数组组成,在Segement数组中包含了HashEntry数组。数据结构如下图所示:  Segement数组的意义就是将一个大的table分割成多个小的table来加锁,而每一个Segment元素存储的... 查看详情

一步一步学vue

为了提升代码的逼格,之后代码改为Vue文件组件,之前代码虽然读起来容易理解,而且适合在小的项目中使用,但是有如下缺点:全局定义(Globaldefinitions) 强制要求每个component中的命名不得重复字符串模板(Stringtemplates) 缺... 查看详情

一步一步学vue

  前言:我以后在文章最后再也不说我下篇博文要写什么,之前说的大家也可以忽略,如果你不忽略,会失望的??,不过说出去的话还是要表示一下的,简单介绍一下路由钩子:  正如其名,vue-router 提供的导航钩子主要... 查看详情

一步一步学vue

本篇完成如下场景:1、系统包含首页、客户信息查询、登录三个模块2、默认进入系统首页,如果要进行用户查询,则需要进行登录授权3、查询用户后点击列表项,则进入详情页面基于上述场景需求描述,在客户端我们考虑,需... 查看详情

一步一步学vue

...不同,我们会对其进行增删改查的基本操作,之后进行进一步的完善,按照常规的系统使用经验,一般我们新增和编辑都是在模态框中处理,这里我们不会去构建复杂的模态框,只用一个简单的div层来代替,后期接下来的文章中... 查看详情

一步一步学vue

本篇是是vue路由的开篇,会以一个简单的demo对vue-router进行一个介绍,主要覆盖以下几个常用场景:1、路由跳转2、嵌套路由3、路由参数 1、Vue-Router  一般来说,路由定义就是定义地址访问规则,然后由路由引擎根据这些... 查看详情

linux一步一步学linux——enable命令(212)(代码片段)

00.目录文章目录00.目录01.命令概述02.命令格式03.常用选项04.参考示例05.总结06.附录01.命令概述enable命令可以用于启动或关闭shell的内建指令。如要执行的文件名称与shell内建指令相同,可用enable-n来关闭shell内建指令。若不加-n... 查看详情

一步一步学ef系列4升级篇实体与数据库的映射livewriter真坑,第4次补发

前言      之前的几篇文章,被推荐到首页后,又被博客园下了,原因内容太少,那我要写多点呢,还是就按照这种频率进行写呢?本身我的意图这个系列就是想已最简单最容易理解的方式进行,每篇内容也... 查看详情

一步一步学nlp:熟悉nlp

NLP学习AI工程师必备的核心技能现实生活中的问题---->数学优化问题---->通过合适的工具解决whatisNLPNLP=NLP+NLUNLU:语音/文本->意思(meaning)Natural+langugeUnderstandingNLG:意思->文本/语音Natural+LangugeGenerationwhatis... 查看详情

一步一步学nlp:熟悉nlp

NLP学习AI工程师必备的核心技能现实生活中的问题---->数学优化问题---->通过合适的工具解决whatisNLPNLP=NLP+NLUNLU:语音/文本->意思(meaning)Natural+langugeUnderstandingNLG:意思->文本/语音Natural+LangugeGenerationwhatis... 查看详情

linux一步一步学linux——wait命令(216)(代码片段)

00.目录文章目录00.目录01.命令概述02.命令格式03.常用选项04.参考示例05.附录01.命令概述wait命令用来等待指令的指令,直到其执行完毕后返回终端。该指令常用于shell脚本编程中,待指定的指令执行完成后,才会继续执... 查看详情

一步一步学j2se-hashmap的实现原理

HashMap数据结构图  HashMap的数据结构是通过数组加链表实现的。数组是HashMap的主体,链表是为了解决Hash碰撞问题。  HashMap的Put方法1、 在put的时候首先判断key值是不是null,如果是null,则处理null值为key所放的位置2、 ... 查看详情