C2-JVM
2021-05-13 14:43:27 0 举报
JVM
作者其他创作
大纲/内容
Java线程
java文件读取-zerocopy--nio
特点:1. 被所有线程共享的一块区域;2. 在虚拟机启动时,创建;3. 存放对象实例;4. 垃圾收集器管理的主要区域;5. 通过设置 -xmx,-xms来动态扩容;
特点:1. 线程共享;2. 用于存放类信息、常量、静态变量、及时编译器编译后的代码;
直接内存Direct Memory
Save和Load操作
工作内存
java线程1. jdk1.2 前基于 “绿色线程”的用户线程实现;2. java线程调度使用的是 抢占式调度的多线程系统;线程安全的实现方法:1. 互斥同步 synchronized 与 ReentrantLock(重入锁)2. 非阻塞同步3. 无同步方案 可重入代码 线程本地存储
JVM只是一个用户进程,处于用户态空间中。而处于用户态空间的进程是不能直接操作底层的硬件的。而IO操作就需要操作底层的硬件,比如磁盘。因此,IO操作必须得借助内核的帮助才能完成(中断,trap),即:会有用户态到内核态的切换。
Java内存模型
Stack Space(堆栈)
本地方法栈
特点:1. 不会受到Java堆大小的限制,只受本机总内存影响;
从上图看出:这里一共只有两次拷贝 和 两次上下文切换。而且这两次拷贝都是DMA copy,并不需要CPU干预(严谨一点的话就是不完全需要吧.)。整个过程如下:用户程序执行 transferTo()方法,导致一次系统调用,从用户态切换到内核态。完成的动作是:DMA将数据从磁盘中拷贝到Read buffer用一个描述符标记此次待传输数据的地址以及长度,DMA直接把数据从Read buffer 传输到 NIC buffer。数据拷贝过程都不用CPU干预了。
规定异常:OutofMemoryError
zerocopy技术可以减少这种拷贝的次数,同时也降低了上下文切换(用户态与内核态之间的切换)的次数。
方法区(永久代)
运行时常量池Runtime Constant Pool特点:1. 存放编译期生成的各种字面量和符号引用;
运行时数据区
synchronized 对一个变量执行unlock之前,先把变量同步到主内存中。
java堆
虚拟机栈
主内存Main memory
特点:1. 线程私有;
-Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M
异常:1. 线程请求栈深度虚拟机所拥有的深度,抛出stackoverflowerror;2. 虚拟机栈动态扩展无法申请到足够内存,抛出outofmemoryerror;
java内存模型是围绕并发过程中,如何处理原子性可见性有序性
异常:OutOfMemoryError
特点:1. 与虚拟机栈相似,唯一的差别是,它为虚拟机使用到的native方法服务。
NIO类 - 引入了一种基于通道channel 与缓存区buffer的I/O方式,使用vative函数库直接分配堆外内存,然后通过调用 存储在java堆种的DirectByteBuffer对象作为这块内存的引用进行操作,这样能避免在java堆和navite堆中来回复制服务。
特点:1. 线程私有;2. 生命周期与线程相同;3. 为虚拟机执行java方法服务;
程序计数器Program Counter Register
final 在构造器中初始化完成。
java文件读取 IO流
NIO类,基于通道channel与缓冲区buffer的io方式。它可以直接使用native函数,分配堆外内存。避免java堆和native堆来回复制数据。
工作内存work memory
volatile提供最轻量级的同步机制。 特点:1. 此变量对所有线程的 可见性。值变化后,其他线程马上得知;2. 不具有原子性;运用场景:1. 运算结果不依赖变量的当前值;2. 变量不需要与其他的状态变量共同参与不变约束;
关键词:DMA--直接内存访问kernel memory buffer--内核缓冲区用户缓冲区NIC buffer--网卡缓存区
0 条评论
回复 删除
下一页