首页 > 系统相关 >JVM内存划分

JVM内存划分

时间:2023-01-21 12:56:07浏览次数:53  
标签:java 虚拟机 计数器 划分 线程 内存 JVM

JVM内存划分

概述

java虚拟机(Java Virtual Machine 简称JVM):是运行所有java程序的抽象计算机,是java语言的运行环境。对于java语言来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个new操作去写delete/free代码,不容易出现内存泄漏与内存溢出问题

常见的JVM有:SUN的HotSpot(主流、后被Oracle收购)、IBM的J9 VM、BEA的JRockit(后被Oracle收购)

Java的执行过程

java源代码(.java)会被java编译器编译为字节码文件(.class),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕后,交由JVM执行引擎执行。执行过程中,JVM用一段空间来存储程序运行所需的数据,这段空间成为运行时数据区,又称为JVM内存

运行时数据区(JVM内存)划分

根据Java虚拟机规范,Java虚拟机管理的内存包括以下数据区域:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区

程序计数器(Program Counter Register)

程序计数器又称为PC寄存器,是用来记录程序当前执行的位置,每一个线程都有自己独有的程序计数器,执行引擎中的字节码解析器工作时就是通过改变这个计数器的值来选取下一条字节码命令,分支、循环、跳转、异常等基础功能都依赖这个计数器来完成

  • 如果线程正在执行的是一个java方法,计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是Native方法,则计数器的值为空
  • 由于程序计数器中存储的数据所在空间大小不会发送改变,因此程序计数器不会发生内存溢出的现象(OOM)

java虚拟机栈(Java Virtual Machine Stack)

java虚拟机栈又称为java栈,线程私有,生命周期与线程相同。每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息

  • 局部变量表:基本类型(long和double占用两个局部变量空间,其余占一个)、对象引用、returnAddress(指向一条字节码指令的地址)
  • 操作数栈
  • 动态链接:将符合引用转换为直接引用
  • 方法出口:方法调用完成,去哪里继续执行

对此区域规定了两种异常:

  • 线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverFlowError异常
  • 如果java虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,抛出OutOfMemoryError异常

本地方法栈(Native Method Stack)

本地方法栈与java虚拟机栈的作用相似,区别是java虚拟机栈为执行java方法服务,本地方法栈为Native方法服务,本地方法栈也会抛出StackOverFlowError异常与OutOfMemoryError异常

  • HotSpot将本地方法栈与java虚拟机栈合二为一,统称为栈

java堆(Java Heap)

java堆是java虚拟机管理的内存中最大的一块,此区域被所有线程共享,在虚拟机启动时创建,目的是存放对象实例(所有对象实例与数组都在堆上分配)

java堆是GC主要工作的区域,又称为GC堆,规定了OOM异常

内存回收采用分代收集算法

方法区(Method Area)

方法区是所有线程共享的区域,用于存储已被虚拟机加载的类信息(构造方法、接口定义),常量,静态变量

内存回收主要是针对常量池的回收与类型卸载,规定了OOM异常

线程共享的数据区划分

堆内存分为年轻代与老年代,内存大小比例:年轻代:老年代为1:2

年轻代内存又分为伊甸园区与幸存区,幸存区又分为from区、to区,内存大小比例:伊甸园区:from区:to区为8:1:1

堆内存存放的是对象,垃圾收集器回收的是这里的对象,不同区域的对象根据不同的GC算法回收(分代收集算法),年轻代用轻GC,老年代用重GC

非堆内存即永久代,也称为方法区,存储程序运行时长期存活的对象,如类的元数据,常量,属性等

jdk1.8废弃了永久代,使用元空间取代,元空间存储的对象与永久代相同,区别是元空间使用的是本地内存,不在jvm中

参考资料

https://cloud.tencent.com/developer/article/2091289

https://zhuanlan.zhihu.com/p/265963546

标签:java,虚拟机,计数器,划分,线程,内存,JVM
From: https://www.cnblogs.com/shenStudy/p/17063716.html

相关文章

  • c++中内存分类
    局部变量,存储位置:栈,存储时间:变量所在程序运行时间全局变量,存储位置:静态存储区,存储时间:程序运行时间static静态变量,存储位置:静态数据区,存储时间:第一次初始化到程序运行结......
  • Linux的mmap文件内存映射机制
    在讲述文件映射的概念时,不可避免的要牵涉到虚存(SVR4的VM).实际上,文件映射是虚存的中心概念,文件映射一方面给用户提供了一组措施,好似用户将文件映射到自己地址空......
  • LeetCode寻找两个正序数组的中位数(vector/二分查找 划分数组)
    原题解这道题可以转化成寻找两个有序数组中的第k小的数,其中k为(m+n)/2或(m+n)/2+1786.第k个数题目给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2......
  • 内存管理系统
    内存池规划内核和用户进程都运行在物理内存中,为了保证内核自身能正常运行,将物理内存分为两个内存池,一部分称为用户物理内存池,此内存池中的物理内存只用来分配给用户进程。......
  • 前端性能优化(一)内存泄漏排查之Chorme浏览器的Performance使用
        前段时间leader突然对我说,优化一下前端内存泄漏的问题,对于这个问题,懵逼的我开始了学习之路,获益匪浅,分享一下,抛砖引玉。    我的Chrome浏览器版本108......
  • 【操作系统】计算机内存管理
    文章目录​​1.内存管理目标rom-ram​​​​2.计算机内存的惰性分配​​​​3.内存管理-分而治之思想​​​​4.内存不够的情况处理​​​​5.内存扩容swap配置实战​​​​......
  • 在windows系统中设置JVM(Java虚拟机)的内存
    虚拟机内存的大小除了在web容器中设置,我们还可以通过系统环境变量来设置,下面看看设置步骤:1.打开windows系统环境变量,在系统变量中,新建变量JAVA_OPTS,值设置为-Xms1024M-Xm......
  • 02linux排查cpu内存过高的进程及使用的文件
    1.先用top命令看下进程和内存使用过高的进程显示前50个top-b|head-50  2.查看占用CPU比较多的进程的网络连接netstat-tnp|grep2166327  确定ip......
  • 计算机中查看内存的具体型号
     001、win+r快捷键,弹出如下对话框  002、输入cmd,然后点击确定   003、输入wmic,然后回车  004、输入memorychip回车,可以看到频率和品牌信息 ......
  • 初步理解:jvm运行机制,java程序运行机制,堆栈详解,jvm调优的目的。
    谷咕咕最近在准备面试,本来想多看看堆和栈的关系,看看发现又设计到gc(GarbageCollection)垃圾回收机制,发现盲区太多了,就去粗略的学习了一下jvm(java虚拟机),发现之前只会写程序,底......