JVM内存结构(1)

简介: JVM内存结构

引言

常见的JVM

学习路线

jvm内存结构

1. 程序计数器

1.1 定义

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

可以看做是当前线程所执行的字节码的行号指示器,字节码解释器的工作时就是通过改变这个计数器的值来选取下一条执行的字节码指令

特点

  • 线程私有的(因为每个线程执行的程序是不一样的)
  • 不会内存溢出

1.2 作用

程序计数实际上是由寄存器来实现的

2. 虚拟机栈

线程私有,且生命周期线程相同,每个方法运行时java虚拟机都会同步创建一个栈帧用于存储局部变量表,也就是栈帧是每个方法运行时需要的内存,比如方法的变,返回值等

2.1 定义

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

栈的默认大小

问题

  1. 垃圾回收是否涉及栈内存?
    不涉及,因为每次方法运行结束栈帧会自动弹出
  2. 栈内存分配的越大越好吗
    不会,栈内存越多那么,线程数目会越少
  3. 方法内的局部变量是否线程安全
  • 局部变量是局部私有的,但是如果static会有线程安全问ti
  • 如果局部变量引用了对象,并逃离了该方法的作用范围也是不安全的

两个线程都会修改同一个StringBuilder对象

这里返回了说明其他线程也会拿到该对象进行修改,也不安全

2.2 栈内存溢出

  • 帧过多导致栈溢出(递归)
  • 栈帧过大

2.3 线程运行诊断

案例一,cpu占用过高

定位

  • 用top定位哪个进程对cpu占用过高
  • ps H -eo pid,tid,%cpu | grep 进程id

可以查看进程内的线程的cpu占用

  • jstack 进程id
  • 可以根据线程id找到有问题的线程,进一步找到问题代码的行号

案例二, 迟迟不到结果

找到死锁

3. 本地方法栈

就是c/c++ 编写的方法和系统底层打交道

JVM内存结构(2)https://developer.aliyun.com/article/1530768

相关文章
|
7天前
|
缓存 算法 关系型数据库
MySQL底层概述—1.InnoDB内存结构
本文介绍了InnoDB引擎的关键组件和机制,包括引擎架构、Buffer Pool、Page管理机制、Change Buffer、Log Buffer及Adaptive Hash Index。
158 97
MySQL底层概述—1.InnoDB内存结构
|
2月前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
|
2月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
3月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
3月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
38 3
|
3月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
73 1
|
3月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
649 1
|
3月前
|
Java Linux Windows
JVM内存
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
36 1
|
3月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
4月前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。