龙空技术网

JVM内存划分、Linux用户态、内核态简介

愿从心出发 158

前言:

此时你们对“对象和数组有什么区别”大约比较看重,大家都需要知道一些“对象和数组有什么区别”的相关文章。那么小编同时在网上收集了一些有关“对象和数组有什么区别””的相关内容,希望看官们能喜欢,大家快快来学习一下吧!

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里面封装了openapi比较原生 写起来比较复杂 fopen写起来比较简单

信息

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

通信

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

标签: #对象和数组有什么区别