zoukankan      html  css  js  c++  java
  • 读书笔记jvm探秘之一:内存概况

               jvm内存大致可以分为六大块:

               堆,虚拟机主要内存,可以形象的说,堆是对象的存储库,几乎所有的对象实例和数组都在此分配内存,当然也死于此,jvm垃圾回收机制(简称GC)主要处理的就是这个地方。它被所有线程共享,没错,这可能造成一些问题,此处留到讨论对象时再说。堆的存储空间在物理上不要求一定连续,实际上它只要让我们看起来是连续的就可以了(虚拟化内存),一般情况下,堆的大小是可以扩展的,当然如果计算机内存满了,导致堆无可申请的话,对象创建就失败了,那么就会抛出outofmemeryError异常。

              方法区,顾名思义,它就是用来存储方法的(当然还有别的=。=),它和堆一样被线程共享,负责存储加载的类信息、常量、静态变量、即时编译器编译后的代码等数据(注意,JAVA代码通常是即时编译的,即用到哪里就编译哪里,用的少的就擦掉,用的多的就留下来)。这里同样需要GC的回收和处理,其实通常需要回收的仅仅是常量池而已(至于类信息吗、、、),方法区和堆一样,无可扩展时就会抛出outofmemeryError异常。

              本地方法栈,线程私有,这个地方如果不深入剖析的话,很难理解这是干什么用的,因此目前俺只知道它用来存储本地的方法(只有个模糊的感念凭感觉这像是干什么的干什么的、、=。=),区别于JAVA方法,它是对非JAVA语言的一种外部接口。还有它是栈,是栈就可能溢出。

              虚拟机栈,每个线程有一个独立的虚拟机栈,互不影响,随线程的出生而出生死亡而死亡,虚拟机栈以帧为单位,每当执行一个方法时,都会在栈顶创建一个栈帧,用于存储局部变量(方法内的)、方法出口等信息,方法的调用和完成的过程,就是栈帧入栈出栈的过程。

              程序计数器,这个很重要,每个线程/方法执行到哪了,在哪休眠,在哪恢复,都需要程序计数器记录,由于CPU每个核心同时只能执行一个线程的指令,所以这种记录是非常必要的,因此它线程私有。

  • 相关阅读:
    flutter填坑之旅(widget原理篇)
    二次封装Element UI Table实现动态列
    vue使用import()提示语法错误
    flutter填坑之旅(配置本地资源文件)
    vue项目提示TypeError: e.call is not a function
    fork树
    从标准输入读取一行数组并保存(用的是字符串分割函数strtok_s() )
    常用算法链接:
    排序算法
    牛客网未通过代码---
  • 原文地址:https://www.cnblogs.com/liboyan/p/4847571.html
Copyright © 2011-2022 走看看