码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JVM——内存区域与内存溢出


    目录

    运行时数据区

     PC寄存器

    使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?

    PC寄存器为什么被设定为线程私有

     虚拟机栈

    局部变量

    静态变量(类变量)和局部变量的对比

    举例栈溢出的情况?

    通过调整栈的大小就能保证不出现溢出现象吗?

    分配栈的内存越大越好吗?

    垃圾回收是否会设计虚拟机栈吗?

    方法中定义的局部变量是否线程安全?

    本地方法栈

    堆

     堆是分配空间的唯一选择吗?

    方法区

    ​编辑 永久代(1.7及以前)为什么被元空间替换

     运行时常量池

    对象实例化的六种方式:

    对象创建的步骤


    运行时数据区

     在Java虚拟机的运行时数据区种,红色部分的是随着虚拟机的创建而创建,随着虚拟机的销毁而销毁,而灰色部分是每个线程一份

     PC寄存器

    PC寄存器用来存储指向下一条指令的地址。也即将执行的指令代码,有执行引擎读取下一条指令。与线程生命周期一致。

    使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?

    因为CPU需要不停的切换各个线程,这时候切换回来以后,就得直到接着从哪开始继续执行。JVM字节码解释器的值来明确下一条应该执行什么样的字节码指令。

    PC寄存器为什么被设定为线程私有

     虚拟机栈

    主管Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。

    每逢线程创建的时候都会创建一个虚拟机栈,虚拟机栈里面保存的是一个个的栈帧,一个栈帧就对应一个Java方法的调用。每个方法被调用直至执行完毕,就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。

    局部变量

    保存的8中基本数据类型、对象的引用地址。

     这也就是为什么在静态方法中不能应用this变量,因为在静态方法的局部变量表的局部变量槽中没有放该数据;而构造方法和实例方法中的局部变量槽的Index为0的位置是放了this。

    静态变量(类变量)和局部变量的对比

     变量的分类:

    按照数据类型分:①基本数据类型 ②引用数据类型

    按照类中声明的位置分:①成员变量:都经历过默认初始化阶段

           类变量(静态变量):linking的prepare阶段:给类变量默认赋值->initial阶段进行显式赋值

           实例变量:随着对象的创建会在堆空间中分配实例变量空间,并进行默认赋值

                                            ②局部变量:在使用前必须进行显示赋值,否则编译不通过

    举例栈溢出的情况?

    StackOverFlowError:通过-xss设置栈的大小,可以设置为固定大小和动态大小,固定大小的情况下不断加栈帧会导致栈溢出。

    通过调整栈的大小就能保证不出现溢出现象吗?

    不能保证。只能是让StackOverFlowError出现的更晚。

    分配栈的内存越大越好吗?

    不是,因为

    垃圾回收是否会设计虚拟机栈吗?

    不会。只有进栈出栈。

    方法中定义的局部变量是否线程安全?

    具体问题具体分析:

    例如:使用线程不安全的类StringBuilder(内部没有加同步锁)来举例子,不然如果使用StringBuffer,本身就是线程安全的就没意义了

    在method1里面的s1是线程安全的。因为一个线程操作这个数据。

    例子二:这里的StringBuilder是以参数的形式传入的

     sBuilder操作的过程是线程不安全的,因为该对象的引用地址是以参数形式传进来,并不是单独保存在该线程里面,所以是线程不安全的

    本地方法栈

    Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用

    堆

    一个Java程序启动的时候就会创建一个Java虚拟机实例,一个Java虚拟机实例里面只存在一个堆空间。

    线程共享的堆可以划分出多个线程私有的分配缓冲区TLAB,以提升对象分配时的效率。

    (几乎)所有的对象实例以及数组都应当在运行时分配在堆上。

     堆是分配空间的唯一选择吗?

    方法区

    是各个线程共享的内存区域,用于存储被虚拟机加载的

    类型信息常量、静态变量即时编译器编译后的代码缓存等数据。 

     

     永久代(1.7及以前)为什么被元空间替换

     运行时常量池

    用于存放编译时期生成的各种字面量与符号引用(例如字面量String、System),这部分内容将在类加载后存放到方法区的运行时常量池中。

    运行时常量池中包含多种不同的变量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或者字段引用,此时不再是常量池中的符号地址了,这里换为真实地址。

    对象实例化的六种方式:

    对象创建的步骤

     

     

  • 相关阅读:
    Java SE 9 新增特性
    程序员应了解的那些事(109)C++的局部类
    使用vue3+element-ui plus 快速构建后台管理模板
    AI - 决策树模型
    GET和POST的区别
    iwebsec靶场 文件上传漏洞通关笔记1-第01关 前端js过滤绕过
    深入解析Java正则表达式:定义、原理和实例
    uniapp使用Canvas实现电子签名
    优秀的推荐系统架构与应用:从YouTube到Pinterest、Flink和阿里巴巴
    微信小程序酒店选择日期和入住人数(有效果图)
  • 原文地址:https://blog.csdn.net/PnJgHT/article/details/127822034
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号