昆明城乡建设网站,中国最新军事武器,巧克力软文范例200字,世界500强企业排行1. 程序计数器
2. 虚拟机栈
3. 本地方法栈
4. 堆
5. 方法区
程序计数器 定义#xff1a; Program Counter Register 程序计数器#xff08;寄存器#xff09; 作用#xff0c;是记住下一条jvm指令的执行地址 特点#xff1a; 是线程私有的 不会存在内存溢出
虚拟机栈…1. 程序计数器
2. 虚拟机栈
3. 本地方法栈
4. 堆
5. 方法区
程序计数器 定义 Program Counter Register 程序计数器寄存器 作用是记住下一条jvm指令的执行地址 特点 是线程私有的 不会存在内存溢出
虚拟机栈
每个线程运行时所需要的内存称为虚拟机栈 每个栈由多个栈帧Frame组成对应着每次方法调用时所占用的内存 每个线程只能有一个活动栈帧对应着当前正在执行的那个方法 线程运行诊断 案例1 cpu 占用过多 定位 用top定位哪个进程对cpu的占用过高 ps H -eo pid,tid,%cpu | grep 进程id 用ps命令进一步定位是哪个线程引起的cpu占用过高 jstack 进程id 可以根据线程id 找到有问题的线程进一步定位到问题代码的源码行号 案例2程序运行很长时间没有结果 死锁
本地方法栈 堆 通过 new 关键字创建对象都会使用堆内存 它是线程共享的堆中对象都需要考虑线程安全的问题 有垃圾回收机制 堆内存溢出 堆内存诊断
jps 工具 查看当前系统中有哪些 java 进程jmap 工具 查看堆内存占用情况 jmap - heap 进程idjconsole 工具 图形界面的多功能的监测工具可以连续监测
垃圾回收后内存占用仍然很高
按照大部分人的理解FullGC 之后 JVM 进程会释放的内存一部分还给物理内存, 1.在 JDK8 CMS 的配置下JVM 并不是立马归还内存给到操作系统而是随着 FullGC 次数的增多逐渐归还最终会全部归还 2.在 JDK8 G1 的配置下JVM 都是在每一次 FullGC 后全部归还物理内存。
如果代码保持不变但是JVM参数中设置Xms和Xmx相同的话不管是否有FullGC堆内存大小都不发生变化也就不释放内存给操作系统
GC 后如何归还内存给操作系统
能不能归还主要依赖于 Xms 和 Xmx 是否相等 何时归还主要依赖于 JDK 版本和垃圾回收器类型 只有 FullGC 的时候才能真正触发堆内存收缩归还 OS。YGC 是不能使 JVM 主动归还内存给操作系统的。
尽量保持 Xms 和 Xmx 一致这样可以减少堆内存调整带来的性能损耗也可以减少堆内存调整带来的无内存风险。
参考 https://segmentfault.com/a/1190000019856974 https://www.cnblogs.com/androidsuperman/p/11743103.html http://blog.dutycode.com
方法区
定义 1.8 以前会导致永久代内存溢出
* 演示永久代内存溢出 java.lang.OutOfMemoryError: PermGen space
* -XX:MaxPermSize8m1.8 之后会导致元空间内存溢出
* 演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace
* -XX:MaxMetaspaceSize8m运行时常量池
常量池就是一张表虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量 等信息 运行时常量池常量池是 *.class 文件中的当该类被加载它的常量池信息就会放入运行时常量 池并把里面的符号地址变为真实地址
StringTable