首页 > 系统相关 >【博学谷学习记录】超强总结,用心分享 | JVM内存结构

【博学谷学习记录】超强总结,用心分享 | JVM内存结构

时间:2022-10-23 12:02:10浏览次数:44  
标签:虚拟机 线程 内存 JVM 超强 方法 加载

目录

这里结合一段 java 代码的执行理解内存划分

  • 执行 javac 命令编译源代码为字节码
  • 执行 java 命令
    1. 创建 JVM,调用类加载子系统加载 class,将类的信息存入方法区
    2. 创建 main 线程,使用的内存区域是 JVM 虚拟机栈,开始执行 main 方法代码
    3. 如果遇到了未见过的类,会继续触发类加载过程,同样会存入方法区
    4. 需要创建对象,会使用内存来存储对象
    5. 不再使用的对象,会由垃圾回收器在内存不足时回收其内存
    6. 调用方法时,方法内的局部变量、方法参数所使用的是 JVM 虚拟机栈中的栈帧内存
    7. 调用方法时,先要到方法区获得到该方法的字节码指令,由解释器将字节码指令解释为机器码执行
    8. 调用方法时,会将要执行的指令行号读到程序计数器,这样当发生了线程切换,恢复时就可以从中断的位置继续
    9. 对于非 java 实现(Native)的方法调用,使用内存称为本地方法栈
    10. 对于热点方法调用,或者频繁的循环代码,由 JIT 即时编译器将这些代码编译成机器码缓存,提高执行性能

说明:

  • 对于 Oracle 的 Hotspot 虚拟机实现,不区分虚拟机栈和本地方法栈

程序计数器:

线程私有的(每个线程都有一个自己的程序计数器), 是一个指针. 代码运行, 执行命令。而每个命令都是有行号的,会使用程序计数器来记录命令执行到多少行了,记录代码执行的位置


Java 虚拟机栈:

线程私有的(每个线程都有一个自己的 Java 虚拟机栈). 一个方法运行, 就会给这个方法创建一个栈帧, 栈帧入栈执行代码, 执行完毕之后出栈(弹栈)存引用变量,基本数据类型


本地方法栈:

线程私有的(每个线程都有一个自己的本地方法栈), 和 Java 虚拟机栈类似, Java 虚拟机栈加载的是普通方法,本地方法加载的是 native 修饰的方法。

native:在 java 中有用 native 修饰的,表示这个方法不是 java 原生的。


堆:

线程共享的(所有的线程共享一份)。存放对象的,new 的对象都存储在这个区域。还有就是常量池。


元空间:

存储.class 信息, 类的信息,方法的定义,静态变量等。而常量池放到堆里存储JDK1.8 和 JDK1.7 的 jvm 内存最大的区别是, 在 1.8 中方法区是由元空间(元数据区)来实现的常量池。

1.8 不存在方法区,将方法区的实现给去掉了。而是在本地内存中,新加入元数据区(元空间)


补充

不会出现内存溢出的区域

  • – 程序计数器

会出现内存溢出的区域

  • 出现 OutOfMemoryError 的情况(内存不足)
    • 堆内存耗尽 – 对象越来越多,又一直在使用,不能被垃圾回收
    • 方法区内存耗尽 – 加载的类越来越多,很多框架都会在运行期间动态产生新的类
    • JVM虚拟机栈累积 – 每个线程最多会占用 1 M 内存,线程个数越来越多,而又长时间运行不销毁时;一个线程在计算时所需要用到栈大小 > 配置允许最大的栈大小时;
  • 出现 StackOverflowError 的区域(栈溢出错误)
    • JVM 虚拟机栈,原因有方法递归调用未正确结束、反序列化 json 时循环引用

标签:虚拟机,线程,内存,JVM,超强,方法,加载
From: https://www.cnblogs.com/Azureblue/p/16818275.html

相关文章

  • new创建动态内存
    int*q=newint;*q=3;cout<<*q<<endl;deleteq;int*q=newint(3);//两种方式newcout<<*q<<endl;deleteq;......
  • PHP内存木马病毒实现原理剖析
    前言内存木马,就是在内存中运行的木马病毒,没有代码实体。内存木马有着强隐蔽性,排查困难,杀不死(俗称不死马)的特点。网络安全行业,有着很强的木桶效应。系统对抗黑帽,胜负取决......
  • 创建对象的内存分析
    在java中提倡万物皆对象的思想,所以对于创建一个对象时的内存分析显得很有必要对象的创建流程new关键字会触发java虚拟机进行堆内存的分配,并返回堆内存的地址一个对象......
  • JVM
    如何判断对象可以被回收五种引用(面试常考):强引用弱引用软引用虚引用终结器引用​​​​image-202208111633282911强引用只有所有GCRoots对象都不通过【强引用】引用该......
  • Linux下驱动开发_块设备驱动开发(内存模拟存储)
    theme:scrolls-lighthighlight:vs2015​一、前言块设备驱动块是Linux下3大设备驱动框架之一,块设备主要是针对存储类型的设备设计的驱动,配合文件系统完成数据存储。在应用......
  • [WPF] 抄抄超强的苹果官网滚动文字特效实现
    1.前言今天ChokCoco大佬发布了一篇博客超强的苹果官网滚动文字特效实现,iPhone我是买不起的,但不妨碍我对抄特效感兴趣,正好我这周安排的工作已经完成了,于是有空练练手......
  • 请问Java语言是跨平台的吗?JVM是跨平台的吗?为什么?
    Java语言是跨平台的,JVM是不跨平台的。Java能跨平台正是以JVM不跨平台为代价的。Java的跨平台性由JVM实现,即JVM用于保证java的跨平台的特性。原理分析:JVM是在机器和编译......
  • JVM 性能调优实战之:一次系统性能瓶颈的寻找过程
    玩过性能优化的朋友都清楚,性能优化的关键并不在于怎么进行优化,而在于怎么找到当前系统的性能瓶颈。性能优化分为好几个层次,比如系统层次、算法层次......
  • JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
    本文是《​​JVM性能调优实战之:一次系统性能瓶颈的寻找过程​​》的后续篇,该篇介绍了如何使用JDK自身提供的工具进行JVM调优将TPS由2.5提升到20(提升了7倍),并......
  • 解决MyEclipse吃内存,让MyEclipse飞起来,MyEclipse速度
    解决MyEclipse吃内存,让MyEclipse飞起来,MyEclipse速度  前言:MyEclipse5.5大小139M;MyEclipse6.5大小451M;MyEclipse7.0大小649M!下载服务器又是国外的。。。下载速度......