JVM初识

内存结构

1、程序计数器
  • 作用:记住下一条jvm指令的地址

  • 特点:线程是私有,不会存在内存移除

2、虚拟机栈
  • 栈帧:每个方法运行时需要的内存

  • 每个线程运行时所需要的内存成为虚拟机栈

  • 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存

  • 每个进程只有一个活动栈帧,对应着当前正在执行的那个方法

方法内局部变量是否安全?

  • 如果局部变量没有逃离方法的作用范围,它是线程安全的
  • 如果是局部变量引用了变量并逃离方法的作用范围(return),需要考虑线程安全问题
栈内存溢出
  • 栈帧过多导致栈内存溢出 stack overflow 方法递归调用没有终止调用
  • 栈帧过大
运行线程诊断
  • cpu占用过多:定位,用top定位那个进程对cpu占用过高,用ps命令进一步定位哪个线程引起的cpu占用过高,jstack 进程id,根据线程id找到有问题的线程,进一步定位到问题代码的源码行数
  • 迟迟得不到结果:发生了死锁
3、本地方法栈

Heap堆

  • 通过new关键字,创建对象都会使用堆内存

特点

  • 它是线程共享的,堆中对象都需要考虑线程安全问题
  • 有垃圾回收机制
4、堆
堆内存溢出

OutOfMeemoryError

堆内存诊断

1、jps工具

  • 查看当前系统中有哪些java进程

2、jmap工具

  • 查看堆内存占用情况

3、jconsole工具

  • 图形界面的,多功能的监测工具,可以连续监测
5、方法区

方法区内存溢出: 1.8之前会导致永代区内存溢出 1.8之后元空间内存溢出

常量池:就是一张表,虚拟机指令根据这张常量池表,要找到执行的类名、方法名、参数类型、字面量等信息

运行时常量池:常量池是.calss文件中,当该类被加载,她的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

6、直接内存
  • 常见于NIO操作时,用于数据缓冲区
  • 分配回收成本较高,但读写性能高
  • 不受JVM内存回收管理
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值