建站需求,建设网站市场细分,免费平面设计软件有哪些,爱你社区JVM HotSpot
Java二进制字节码的运行环境
好处#xff1a;
一次编写#xff0c;到处运行自动内存管理#xff0c;具有垃圾回收功能数组下标越界检查多态#xff08;虚方法表#xff09;
JVM组成
类加载子系统#xff08;Java代码转换为字节码#xff09;运行时数据…JVM HotSpot
Java二进制字节码的运行环境
好处
一次编写到处运行自动内存管理具有垃圾回收功能数组下标越界检查多态虚方法表
JVM组成
类加载子系统Java代码转换为字节码运行时数据区字节码加载到内存执行引擎 解释器、即时编辑器、GC垃圾回收字节码翻译为底层系统指令本地方法接口
运行时数据区
程序计数器
记录下一条要执行的字节码指令的地址
如果正在执行本地方法则计数器的值为空
每个线程都要有自己的程序计数器程序计数器是线程私有的没有规定任何OutOfMemoryError情况
Java虚拟机栈
线程私有生命周期与线程相同 每个方法被执行的时候JVM都会同步地创建一个栈帧存储 方法调用、执行完毕对应栈帧在虚拟机栈中的入栈到出栈 局部变量表 存储编译期可知的JVM基本数据类型、对象引用、returnAddress
每个线程运行时需要的内存称为虚拟机栈栈帧对应每次方法调用占用的内存每个线程只能有一个活动栈帧
-Xss 可用指定栈内存分配大小 Linux默认1024
栈内存溢出 原因
StackOverflowError栈帧过多方法调用过多递归调用过多层使用第三方库进行json数据转换两个实体互相依赖OutOfMemoryError栈帧过大 CPU占用过高怎么诊断Linux 的top命令监测后台进程ps H -eo pid,tid,%cpu | grep 进程id ps命令定位线程jstack 进程id将第二部定位的线程id转换成16进制在第三步得到的信息中查看问题线程
本地方法栈
虚拟机栈为虚拟机执行Java方法本地方法栈则是为虚拟机使用到的本地Native方法服务。
Java堆GC堆垃圾回收
线程共享的 堆内存溢出 -Xmx 设置堆空间的最大值排除内存溢出问题时可用把堆内存设置小一点 jps 查看系统中有那些java进程 jmap 查看堆内存占用情况 jmap -heap 线程id jconsole
tips: jconsole中有检测死锁按钮 jvisualvm 堆Dump查看堆快照可用查看到对象信息
方法区
线程共享、堆的逻辑部分别名“非堆” 存储已经被JVM加载的 类型信息、常量、静态变量、即时编译后的代码缓存
JDK8以前HotSpot虚拟机把手机器的分代回收扩展至方法区使用永久代来实现方法区垃圾收集器能够像管理Java堆一样管理这部分内存省去专门为方法区编写内存管理代码的工作。
JDK8完全放弃永久代 运行时常量池
常量池 虚拟机指令根据常量池一张表找到要执行的类名、方法名、参数类型、字面量等信息。
运行时常量池 类被加载类的常量池信息会放入运行时常量池并把符号地址变为真实地址 StringTable 哈希表结构存储字符串常量
直接内存
操作系统内存
常见于NIO操作用户数据缓存区分配回收成本较高不受JVM内存回收管理
HotSpot对象
字节码new指令检查指令的参数能否在常量池中定位到 一个类的符号引用检查符号引用代表的类是否已经被 加载、解析和初始化没有则先执行相应类加载过程分配内存初始化设置对象头
内存分配 GC是否有空间压缩整理能力 – 有- 指针碰撞无 - 空闲列表
线程安全问题同步处理 CAS;本地线程分配缓冲 每个线程在Java堆预先分配一小块内存线程本地缓冲区用完了分配新的缓存区才同步锁定
对象的内存布局 对象在堆中的存储布局对象头、实例数据、对齐填充
根节点枚举
固定可作为GC Roots的节点主要在全局性引用常量或类静态属性于执行上下文例如栈帧中的本地变量表根节点枚举必须在一个能够保障一致性的快照中根节点枚举必须暂停用户线程 Stop The World OopMap数据结构来直接得到哪些地方存放着对象引用
安全点 以“是否具有让程序长时间执行的特征”来选定
用户程序只有执行到 安全点 才能暂停
如何控制GC时所有线程跑到安全点停下
抢先式中断 全部中断未到安全点线程复活过一会儿再中断主动式中断 标记线程安全点轮询 定 用户程序只有执行到 安全点 才能暂停
如何控制GC时所有线程跑到安全点停下
抢先式中断 全部中断未到安全点线程复活过一会儿再中断主动式中断 标记线程安全点轮询