Java二进制字节码的运行环境
好处:
记录下一条要执行的字节码指令的地址
如果正在执行本地方法,则计数器的值为空
线程私有,生命周期与线程相同
每个方法被执行的时候,JVM都会同步地创建一个栈帧(存储)
方法调用、执行完毕对应栈帧在虚拟机栈中的入栈到出栈
局部变量表 存储编译期可知的JVM基本数据类型、对象引用、returnAddress
-Xss
可用指定栈内存分配大小 Linux默认1024
栈内存溢出
原因:
Linux
的top命令,监测后台进程虚拟机栈为虚拟机执行Java方法,本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
线程共享的
堆内存溢出:
-Xmx
设置堆空间的最大值,排除内存溢出问题时,可用把堆内存设置小一点
jps
查看系统中有那些java进程
jmap
查看堆内存占用情况 jmap -heap 线程id
jconsole
tips: jconsole中有检测死锁按钮
jvisualvm
堆Dump查看堆快照,可用查看到对象信息
线程共享、堆的逻辑部分,别名“非堆”
存储已经被JVM加载的 类型信息、常量、静态变量、即时编译后的代码缓存
JDK8以前,HotSpot虚拟机把手机器的分代回收扩展至方法区,使用永久代来实现方法区垃圾收集器能够像管理Java堆一样管理这部分内存,省去专门为方法区编写内存管理代码的工作。
常量池 虚拟机指令根据常量池(一张表)找到要执行的类名、方法名、参数类型、字面量等信息。
运行时常量池 类被加载,类的常量池信息会放入运行时常量池,并把符号地址变为真实地址
StringTable 哈希表结构,存储字符串常量
操作系统内存
内存分配: GC是否有空间压缩整理能力 – 有-> 指针碰撞;无 -> 空闲列表
线程安全问题:同步处理 CAS;本地线程分配缓冲 每个线程在Java堆预先分配一小块内存,线程本地缓冲区用完了,分配新的缓存区才同步锁定
对象的内存布局
对象在堆中的存储布局对象头、实例数据、对齐填充
用户程序只有执行到 安全点 才能暂停
如何控制GC时,所有线程跑到安全点,停下?
如何控制GC时,所有线程跑到安全点,停下?
更多【jvm-JVM 笔记】相关视频教程:www.yxfzedu.com