码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 深入理解java虚拟机-Java内存区域与内存溢出异常


    文章目录

    • 运行时数据区
      • 程序计数器
      • Java虚拟机栈
      • 本地方法栈
      • Java堆
      • 方法区
      • 运行时常量池
      • 运行时常量池
      • 直接内存
    • hotspot虚拟机对象探秘
      • 对象的创建
        • 分配内存
          • 指针碰撞
          • 空闲列表
          • CMS收集器方式
        • 分配内存的并发问题
          • CAS
          • TLAB
        • 设置对象信息
        • init
      • 对象的内存布局
        • 对象头
        • 实例数据
        • 对齐填充
      • 对象的访问定位
    • 实战:OOM异常

    运行时数据区

    程序计数器

    • 程序计数器可以看做是当前线程所执行的字节码的行号指示器
    • 每条线程都有一个独立的程序计数器,属于线程私有内存
    • 此内存区域是唯一一个没有规定OOM情况的区域

    Java虚拟机栈

    • 线程私有,生命周期与线程相同
    • 虚拟机栈描述的是java方法执行的内存模型.每个方法从调用到执行完成的过程.都对应这一个栈帧在虚拟机栈中的入栈和出栈
    • 栈帧是方法运行时的基础数据结构
    • 局部变量表:存放编译期可知的基本数据类型,对象引用,returnAddress类型,
    • 虚拟机执行Java方法服务

    本地方法栈

    • 虚拟机使用native方法服务

    Java堆

    • 线程共享
    • 垃圾回收器管理的主要区域,也被成为GC堆
    • 从分代收集算法的内存回收角度来划分
      新生代 包含:eden空间/from servivor空间 / to survivor空间
      老年代

    方法区

    • 线程共享
    • 存储已被虚拟机加载到类信息,常量,静态变量,即时编译器编译后的代码

    运行时常量池

    • 线程共享
    • 存储已被虚拟机加载到类信息,常量,静态变量,即时编译器编译后的代码

    运行时常量池

    • 运行时常量池是方法区的一部分
    • 存放编译期生成的个中字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放.

    直接内存

    • 并不是运行时数据区的一部分

    hotspot虚拟机对象探秘

    对象的创建

    分配内存

    类加载完成后便完全确定了对象所需的内存大小

    指针碰撞

    假设java堆中的内存都是绝对规整的,所有用过的内存都放在一边,空闲的内存放到另一边.中间放着一个指针作为分界点的指示器.那所分配的内存仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离.

    空闲列表

    Java堆不规整,已使用的内存和空闲的内存相互交错.虚拟机必须维护一个列表.记录哪块内存是可用的.在分配的时候从列表中找到一块足够大的的空间划分给对象,并更新列表上的记录

    CMS收集器方式

    采用CMS收集器的 通常采用空闲列表

    分配内存的并发问题

    CAS

    采用CAS配上失败重试的方式保证原子性

    TLAB

    每个线程预先在Java堆中分配一块内存称为本地线程分配缓冲(TLAB),哪个线程分配内存,就在哪个线程的TLAB上进行分配. 设定: -XX:+/-UserTLAB

    设置对象信息

    将信息存放到对象的对象头

    init

    从虚拟机的角度来看,对象已经创建完成.new 指令完成 .但从java角度来看,对象创建刚刚开始,init()方法还没有执行.所有的字段都为零. 执行new指令后接着执行init指令进行初始化,这样一个对象才算完全产生.

    对象的内存布局

    对象头

    • 第一部分(mark word) 存储对象自身运行时数据(哈希吗.GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID),
    • 第二部分类型指针,即对象指向他的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.

    实例数据

    对象真正存储的有效信息.即程序代码中定义的各种类型的字段内容

    对齐填充

    保证对象的大小必须是8字节的整数倍

    对象的访问定位

    • 句柄
      在这里插入图片描述

    • 直接指针
      在这里插入图片描述

    实战:OOM异常

    略.

  • 相关阅读:
    java实现快速排序的方法
    【JVM笔记】Java虚拟机栈与常见异常和如何设置栈内存大小
    BOM操作——window对象(一)
    用20行python写一个最简单的网站
    BHQ-1 amine,1308657-79-5,BHQ染料通过FRET和静态猝灭的组合工作
    适合Linux新手使用的版本有哪些?
    <C++>【类与对象篇】(一)
    TikTok本周动态,TikTok Shop新加坡首场大促将于本月举行
    MyBatis 环境搭建配置全过程【IDEA】
    Vxlan协议原理及基本配置——网络测试仪实操手册
  • 原文地址:https://blog.csdn.net/T_Mac9334/article/details/126017271
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号