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

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变量分配栈内存 赋值10
4、修改a值为11
5、执行完func1释放栈内存
栈遵循先入后除原则 先删除b再删除a

示例二

示意图

1、执行func1在栈中分配内存给变量a并赋值10 占4个字节大小
2、在栈中分配内存给变量b并赋值10 占4个字节大
3、在堆中创建一个对象new Person id默认为0 ,name默认为null
4、在栈中分配内存给变量p表示指向对象的地址 地址是int类型 占4个字节大 是引用类型
5、通过p指针给堆中的对象的属性id赋值为1
6、在堆中创建一个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=111
3、通过p指针修改对象的属性id为222
4、执行完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、control
6、进程 fork 当前程序中再创建一个进程;exit进程退出
7、c语言打开文件用的是fopen
fopen是一个库函数
并不是一个直接的系统调用
open是一个系统函数
fopen里面封装了open

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

信息

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

通信

通讯 进程之间的通信 pipe(管道)建立文件和内存的映射mmap
mmap也属于设备类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值