JVM内存划分


1、在Java运行的时候 JVM虚拟机拿到自己能支配的内存 将内存进行分割2、本地方法栈存储是C++ native方法3、程序计数器指向程序当前运行的位置4、方法区存储元数据信息在jdk1.7之前 叫做永久代jdk8之后改为元数据空间主要存储一些静态方法或变量 类加载classloader等等这样一些全局的信息5、栈区存储函数当前运行中的临时变量栈、本地方法栈、程序计算器是线程私有的每个线程在运行的过程中 会单独分配内存有多少线程就会有多少栈区6、堆区和方法区都是全局共享堆区主要用来存对象7、栈区存储的是对象的引用类型 只是对象的一个地址 最终指向堆区实际存在的对象

举例说明

示例1

java程序代码


结果为20,10

示意图


1、执行main函数 在栈中给a变量分配栈内存 赋值10(a是实参数)2、执行func1 在栈中给a变量分配栈内存 赋值10(a变成了形参)3、在栈中给b变量分配栈内存 赋值104、修改a值为115、执行完func1释放栈内存栈遵循先入后除原则 先删除b再删除a

示例二


示意图


1、执行func1在栈中分配内存给变量a并赋值10 占4个字节大小2、在栈中分配内存给变量b并赋值10 占4个字节大3、在堆中创建一个对象new Person id默认为0 ,name默认为null4、在栈中分配内存给变量p表示指向对象的地址 地址是int类型 占4个字节大 是引用类型5、通过p指针给堆中的对象的属性id赋值为16、在堆中创建一个String对象 该对象中有char数组char数组是值类型 不是一个对象类型7、p指针给堆中的对象的属性name 它也代表一个指针 指向String对象8、func1执行完释放圈红部分内存 栈上12字节的内存就会被释放9、堆中的对象如何释放?在堆上运行的对象不能随着函数运行完毕自动清理你也不知道是否有其他线程也引用当前对象是否也是引用的当前这个地址来访问的

Java的基础数据类型都是值类型 指针也是值类型 因而是直接存到内存 不是存地址去寻址

1、main函数在方法区2、如果类Main中有一个static Integer a 静态全局变量那么该变量会存放在方法区中 所有的栈函数都可以Main.a引用

示例三


结果为222

示意图


1、在执行func1的时候 会创建一个形参p即p2的副本2、p和p2 指向同一个堆中对象 属性id=1113、通过p指针修改对象的属性id为2224、执行完func1 释放圈红部分内存5、此时对象的id属性值为222

Linux用户态、内核态

程序处理的状态在运行过程中可能处于内核态也可能处于用户态可能某一时刻处于用户态下一时刻切换到内核态

用户态在什么情况下能切换到内核态呢即触发条件


1、内核态的相关操作执行完了就会退回到用户态2、外部资源:打开机箱盖 放眼望去都是属于外部资源内存条网卡磁盘主板上的声卡主板上的网卡主板上的usb外设主板上的声光同步的LED

想要操作这些硬件的话 都需要从用户态切换到内核态比如读写文件(系统调用 open read write(系统调用的名称同时也是c语言内置的函数的名称))的时候 就会触发用户态到内核态3、申请内存(堆内存) c语言通过malloc(c语言内置函数名称并没有一个系统调用名称与之对应)

分配内存 malloc


两者是虚拟内存空间并不是主存物理内存空间真正拿到物理内存空间还要在第一次访问的时候发现虚拟内存地址没有映射到物理内存地址 于是触发一个叫缺页中断(也叫缺页异常)操作系统中的中断和异常有很多类似的地方java在new对象的时候也经历了这样的过程

brk

小于128k内存申请调用brk

mmap

在内存的堆空间游标到栈最小内存地址之间申请内存

最常见就是系统调用


在linux系统通过man syscalls查看所有的系统调用命令1、accept:套接字客户端连接套接字2、bind套接字服务端监听端口3、brk是macloc的一种实现形式 是申请内存的4、chmod、chown、open、read、write 这些命令都是对文件进行操作5、 open read wirte 也是对磁盘的操作也可以归为设备类,设备类还比如io、control6、进程 fork 当前程序中再创建一个进程;exit进程退出7、c语言打开文件用的是fopenfopen是一个库函数并不是一个直接的系统调用open是一个系统函数fopen里面封装了open

api比较原生 写起来比较复杂 fopen写起来比较简单

信息

比如获取当前cpu信息(getcpu)、操作系统信息对应的函数getxxx

通信

通讯 进程之间的通信 pipe(管道)建立文件和内存的映射mmapmmap也属于设备类

JVM内存划分、Linux用户态、内核态简介相关推荐

  1. Linux系统中内核态、用户态和零拷贝技术解析

    ​目录 ​第一:存储介质的性能 ​第二:内核态和用户态 第三:内核态和用户态是怎么控制数据传输的? ​第四:什么是 DMA ? ​第五:零拷贝技术实现的方式 第六:mmap + write 第七:se ...

  2. Linux 0.11-从内核态到用户态-23

    Linux 0.11-从内核态到用户态-23 从内核态到用户态 转载 从内核态到用户态 书接上回,上回书咱们从整体上鸟瞰了一下第三部分要讲的内容,代码上就是还差四句话就走到了 main 函数的尽头. ...

  3. 42.Linux应用调试-初步制作系统调用(用户态-内核态)

    1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...

  4. 5分钟搞懂用户态,内核态

    5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O.内核必须提供一组通用的访问接口,这些接口就叫系统调用 ...

  5. 操作系统用户态内核态线程同步

    1.计算机系统中有两类程序:系统程序和应用程序.为了保证系统程序不被应用程序破坏,为计算机设置了两种状态:内核态和用户态. 内核态运行的程序可以访问计算机的任何资源不受限制. 用户态运行的程序可以直接 ...

  6. 用户态/内核态、用户栈/内核栈

    一.用户态和内核态 内核态和用户态是操作系统的两种运行级别,用于区分不同程序的不同权利. 内核态就是拥有资源多的状态,或者说访问资源多的状态,也称为特权态.相对来说,用户态就是非特权态,访问的而资源将 ...

  7. java 内存溢出的分类_【深入理解Java虚拟机】读后感:JVM内存划分与内存溢出小结...

    扫码关注公众号:Java 技术驿站 发送:vip 将链接复制到本浏览器,永久解锁本站全部文章 [公众号:Java 技术驿站] [加作者微信交流技术,拉技术群] # JVM内存划分与内存溢出小结 # 1 ...

  8. Linux 操作系统原理 — 内核态与用户态

    目录 文章目录 目录 Linux 的内核态与用户态 系统调用(System Call) Shell 用户态和内核态的切换 进程的用户空间和内核空间的内存布局 内核空间 用户空间 Linux 的内核态与 ...

  9. Linux预备知识(三):系统调用-用户态/内核态

    1)示例 void testfork() { if(0 = = fork()){ printf("create new process success!\n"); }printf( ...

最新文章

  1. IEEE Spectrum调查:AI 的 6 种最坏情况
  2. [unity3d]水果忍者-界面搭建
  3. 使用 Code Snippet 简化 Coding
  4. 《转》Java字符串驻留池
  5. 如何优雅地在 Linux 上运行 QQ、微信?
  6. RSA加解密用途简介及java示例
  7. java对列表数据排序_如何在Java中对列表进行排序
  8. (响应式PC端媒体查询)电脑屏幕分辨率尺寸大全
  9. hdu 4928 Series 2 (优化+模拟)
  10. 周期信号波形识别及参数测量装置(J 题) 【高职高专组】--2021 年全国大学生电子设计竞赛
  11. Rayman的绝顶之路——Leetcode每日一题打卡8
  12. 北海屠龙记------十三
  13. ONF执行主席Dan Pitt:SDNFV会聚而合
  14. keil软件仿真时如何使用逻辑分析仪查看波形
  15. Kubernetes部署
  16. Multi-Objective Computation Sharing in Energy and Delay Constrained Mobile Edge Computing
  17. 2022年武汉市创新型中小企业认定条件和评价指标
  18. BUUCTF RE [SUCTF2019] SignIn
  19. usb与 hid, 串口 趣谈
  20. 【Python脚本进阶】2.1、端口扫描器(下):NMAP端口扫描

热门文章

  1. LabVIEW I/O服务器创建时的相关问题汇总
  2. Spark_UDAF
  3. git commit命令
  4. 微信小程序黑客马拉松即将开始,来做最酷的 Mini Program Creators! 1
  5. 7.2. cvs login | logout
  6. 深度学习在医疗方面的应用 精准医学受追捧
  7. 20170721L08-02-02老男孩Linux运维实战培训初级第八节课课前【上机实战】考试讲解...
  8. 摘抄:微软 Dynamics AX 学习步骤
  9. Honey Dance I believe
  10. [导入]值得收藏经典民间偏方