JVM内存结构

JVM内存结构一、程序计数器1.定义​ Program Counter Register 程序计数器(寄存器)2.作用​ 背景:java源代码-JVM指令-解释器-机器码​ 程序计数器会记住下一条JVM指令的执行地址3.实现​ 硬件:寄存器4.特点每个线程都有自己程序计数器(线程私有)不会存在内存溢出二、虚拟机栈1.定义每个线程运行时都需要的内存空间(线程私有)。栈由栈帧组成,栈帧调用不同的方法所占用的内存。​ (idea中的frames可以演示栈帧的变化)
摘要由CSDN通过智能技术生成

JVM内存结构

内存模型

一、程序计数器

1.定义

​ Program Counter Register 程序计数器(寄存器)

2.作用

​ 背景:java源代码-JVM指令-解释器-机器码
​ 程序计数器会记住下一条JVM指令的执行地址

3.实现

硬件:寄存器

4.特点

  1. 每个线程都有自己程序计数器(线程私有
  2. 不会存在内存溢出

二、虚拟机栈

1.定义

  • 每个线程运行时都需要的内存空间(线程私有)。

  • 栈由栈帧组成,栈帧调用不同的方法所占用的内存。

​ (idea中的frames可以演示栈帧的变化

2.栈内存溢出

(1)栈帧过多导致占内存溢出
错误的递归调用
对象转json字符串时,存在类间的双向引用(死循环)
(2)栈帧过大导致栈内存溢出

3.线程运行诊断

(1)CPU占用过高
  • top --定位线程占用cpu的情况
  • ps H -eo pid,tid,%cpu|grep pid --查询线程的占用情况
  • jstack pid
    • 根据pid找到有问题的线程,进一步定位到问题代码的源码行号

(2)死锁情况

​ 线程1锁住了线程2的A锁;线程2锁住了线程1的B锁

4.注意点

(1)垃圾回收是否涉及栈内存?

​ 不需要。栈内存是方法的调用,调用结束后即出栈

(2)栈内存分配越大越好码?

​ 不是。由定义可知:栈内存是单个线程运行的空间,总空间一定时,栈内存越大,容纳的线程数越少。

(3)方法内的局部变量是否线程安全?

​ 是。栈是线程私有的,相当于每次都new出一个方法进入不同的栈。

(4)哪些变量是线程不安全的?

​ 有可能被其他线程访问到的变量。

三、本地方法栈

概念

  • 不是java编写的底层方法(native)使用的内存空间。

四、堆

1.定义

  • 通过new关键字创建的对象都会使用堆内存(共享)

2.特点

线程共享	——因此需考虑线程安全问题
有垃圾回收机制  --System.gc()

3.堆内存溢出

出现溢出的原因
  • 那些本该回收的对象,仍然被使用着,当规模达到一定程度,则出现溢出。(OutOfMemoryError
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值