ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

JVM 内存结构

2021-07-08 23:32:40  阅读:169  来源: 互联网

标签:栈帧 计数器 线程 内存 JVM id cpu 结构


java文件转换成class

一. 程序计数器

1.1定义

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

基本作用:用于记住下一条jvm指令的执行地址

特点:

  • 线程是私有: 程序计数器是属与自己线程的
  • 不会存在内存溢出

当解释器执行完一条指令后,会去程序计数器中查找下一条指令的地址。
当解释器执行下一条指令的时候,程序计数器又会去记录新的下一条指令的地址

在物理上,程序计数器是通过一个叫寄存器实现的,
寄存器是整个cpu组件里,读取速度最快的一个单元,

二.虚拟机栈

Java Virtual Machine Stacks (Java 虚拟机栈) 

2.1 定义

  • 定义:每个线程运行需要的内存空间,成为虚拟机栈
  • 每个栈帧(Frame)组成,对应着每次方法调用时所占的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

问题1: 垃圾回收是否涉及栈内存
答: 不需要,栈弹出后就被释放掉了,不需要垃圾回收来管理栈内存

问题2: 栈内存分配越大越好吗?
答: 不是栈内存越大,只是可以进行很多次的内存调用,并不会提高运行效率,而且栈内存越大,最大线程数据则会相应的减少。一般采用系统默认的大小即可,除windowsw外,其他系统默认为1024k, windows则看虚拟内存

问题3: 方法内的局部变量是否线程安全
答: 如果方法內部变量没有逃离方法作用的范围,他是线程安全的
如果是局部变量引用了对象,并逃离方法的作用方法,需要考虑线程安全

2.2 栈内存溢出

栈帧过多,造成栈内存溢出
栈帧过大,

2.3 线程运行诊断

案例1: cpu 占用过高

定位

  • 用top定位哪个经常cpu占用过高
  • ps H eo pid, tid, %cpu|grep 进程id (用ps命令进一步定位是哪给线程引起的cpu占用过高)
  • jstack进程id
  •   可以根据线程id,找到有问题的线程,进一步定位代码
    
案例2: 程序运行很长时间没有结果
  • jstack进程id

三.本地方法栈

四.堆

五.方法区

标签:栈帧,计数器,线程,内存,JVM,id,cpu,结构
来源: https://blog.csdn.net/qq_23079469/article/details/118582569

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有