JVM内存区域运行时数据区域分为两种:

JVM内存区域

运行时数据区域分为两种:

  1. 线程隔离的数据区:

    • 程序计数器
    • Java虚拟机栈
    • 本地方法栈
  2. 所有线程程共享的数据区:

    • Java堆

    • 方法区

JVM 内存区域 ———栈介绍

所谓 “栈”包括:Java虚拟机栈,本地方法栈,他们的作用相似,区别只是:

虚拟机栈:虚拟机栈为虚拟机执行Java方法(也就是字节码)服务

本地方法栈: 虚拟机使用到的Native方法服务

程序员人为的分为“堆栈”中的“栈”。

栈里存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和指向了一条字节码指令的地址

每个方法在执行的同时都会创建一个栈帧(StackFrame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

局部变量表所需的内存空间在编译期间完成分配,其中64位的long和double类型的数据会占2个局部变量空间,其余的数据类型只占用1个。当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

操作数栈也要操作栈,主要是在方法计算时存放的栈。

JVM 内存区域 ———堆介绍

Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块,此内存区域就是存放对象实例,几乎所有的对象实例都在这里分配内存。

Java堆是垃圾收集器管理的主要区域;内存回收的角度来看Java堆中还可以细分为:新生代和老年代;新生代细致一点的有Eden空间、From Survivor空间、To Survivor空间。

在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx设置最大内存和-Xms设置初始内存)

JVM内存区域-方法区

方法区又叫静态区:用于存储已被虚拟机加载的类信息、常量池、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆);

对于HotSpot虚拟机是使用永久代来实现方法区;

Java虚拟机规范对方法区的限制非常宽松,除了不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个区域是比较少出现的,这区域的内存回收目标主要是针对常量池的回收和对类型的卸载,条件相当苛刻。

12345678910111213141516171819202122
public class Test{

public static void main(String[] args){

//s1,s2分别位于堆中不同空间

String s1=new String("hello");

String s2=new String("hello");

System.out.println(s1==s2);//输出false

//s3,s4位于池中同一空间

String s3="hello";

String s4="hello";

System.out.println(s3==s4);//输出true

  }}

JVM 内存区域——-异常

程序计数器
没有指定任何OutOfMemoryError情况
java虚拟机栈\本地方法栈区域
如果线程请求的栈深度于虚拟机所允许的深度,将抛出StackOverflowError异常;如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常

如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常报错后dump出信息: -XX:+HeapDumpOnOutOfMemoryError
方法区
当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常

Java虚拟机------JVM内存区域相关推荐

  1. 深入理解Java虚拟机--JVM内存模型

    目录 一.运行时数据区域 1.程序计数器 2.Java 虚拟机栈 3.本地方法栈 4.Java 堆 5.方法区 6.运行时常量池 7.直接内存 二.OutOfMemoryError异常 1.Java堆 ...

  2. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  3. java jvm内存地址_深入Java虚拟机——JVM内存详解

    在C++中,程序员拥有每一个对象的所有权,但与此同时还肩负着释放对象内存空间的责任:而Java由于有了虚拟机的帮助,程序员拥有对象的所有权的同时不再需要释放对象的内存空间.由于是JVM自动进行对象内存 ...

  4. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

  5. Java虚拟机 之 内存区域

    引言 上一篇介绍了JVM的发展史,那只是简单的看了JVM,只是知道有这么一个东西,是干什么用的:从这一篇到未来,将一点点慢慢了解它,为的是为以后的学习打下基础和浇灭面试官的狂气 :). 简介 下面是我 ...

  6. java虚拟机JVM内存不够,OutOfMemorry Error

    2019独角兽企业重金招聘Python工程师标准>>> java.lang.OutOfMemoryError,这个错误是由于Java虚拟机分配的内存不够造成的,网络上很多文章说修改e ...

  7. JAVA虚拟机 安全区域_Java虚拟机的内存区域

    2020年12月10日 阅读 186 关注 Java虚拟机的内存区域 最近在看<深入理解Java虚拟机>,故此写下自己的学习笔记. JVM 运行时数据区域 Java 虚拟机在执行 Java ...

  8. [转载] java虚拟机 jvm 出入java栈 栈空间内存分配

    参考链接: Java虚拟机(JVM)堆栈区域 java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调 ...

  9. 深入理解java虚拟机一 JAVA运行时内存区域与class文件

    一 JAVA运行时内存区域 JVM在加载class文件时,会将class文件定义的数据结构转为运行时内存中的数据,那么jvm是如何安排运行时的内存区域呢? jvm将运行时内存划分为以下几个部分: 堆: ...

最新文章

  1. IO多路复用的三种机制Select,Poll,Epoll
  2. BZOJ 4802: 欧拉函数(大数因数分解算法 Pollard_rho 和素数测试算法 Miller_Rabin)
  3. 最小生成树的Kruskal算法实现
  4. 免费!Excel数据分析训练营!让你1招建立可视化数据分析思维模型!​
  5. 高级同步器:可重用的同步屏障Phaser
  6. android二分查找法简书,【PYTHON】二分查找算法
  7. git 命令之 如何将本地新建分支推到服务器上
  8. 【JAVA】 02-Java对象细节
  9. python seek_Python 文件操作seek()函数
  10. 在线2-36进制转文本工具
  11. 贪心 穷举 动态规划 区别
  12. Gephi教程——外观和布局
  13. 好看的android动画效果
  14. android禁止屏幕自动旋转_Android 禁止屏幕旋转 屏幕旋转不刷新 Activity 动态更改屏幕方向...
  15. 用maven的 Mybatis代码生成器
  16. 锐龙r76800h和酷睿i512500h核显对比 r7 6800h和i5 12500h哪个好
  17. 只需两分钟,如何下载b站高清封面图片
  18. 内存存放方式_如何以正确的方式存放剩余涂料
  19. 【博主推荐】大数据可视化大屏(源码下载)
  20. 神经网络 mse一直不变_使用深度卷积神经网络的儿科骨龄评估

热门文章

  1. C#学习笔记_12_枚举结构体
  2. App开发流程之创建项目和工程基本配置
  3. [ubuntu]deb软件源
  4. MSSQL数据库设计心得
  5. 【转】解决XMLHTTP获取网页中文乱码问题
  6. 计算机网络的唯一缺点,有点伤感的说说 我唯一的缺点就是,对你太好
  7. 动态规划——零钱兑换(Leetcode 322)
  8. html中%3csvg%3e标签的使用,微信小程序:使用svg
  9. mysql防止数据查找不到_为了防止数据库崩溃使数据丢失的解决方案
  10. Oracle-索引分裂研究