JVM 内存介绍

本文主要介绍: JVM 内存分哪几个区,每个区的作用是什么
备注:
橙色:堆 和 方法区 ,属于jvm公有部分,可以进行调优
灰色:java栈,本地方法栈和计数器 属于jvm的私有部分,不可进行调优

一个对象从创建到被回收的过程是怎样的?

Personp=new Person() 100个对象
第一步:
        100个对象创建之后,会存储到新生代中的伊甸园区
第二步:
        经过一轮GC后,绝大多数的对象会被回收,仅剩下5个对象存活
第三步:
        再创建100个对象+5=105对象
        又经过第二轮gc之后,仍有5个存活,其中有2个是上一轮留下的
第四步:
        经过15轮gc 后仍然存活的对象 会存入到养老区。
第五步:
        养老区中也会进行GC,一旦养老代gc速度赶不上对象的产生速度了,就会OOM,出现jvm挂机

类是如何加载进内存中?

核心是需要classLoader
会涉及双亲委派机制所以分类自上而下的去罗列
Bootstrap ClassLoader根加载器 rt.jar
Extension ClassLoader扩展类加载器
Application ClassLoader 应用类加载器
用户自定义类加载器如果
自定义String

总结过程:

        三大步 :加载---->连接---->初始化
        七小步 :加载---->验证---->准备---->解析---->初始化---->使用---->卸载
        加载:将class文件加载到内存中
        验证:验证字节码文件的正确性
        准备:为类的静态变量分配内存空间并赋予初始值
        解析:类加载器加载类所需的其他类
        初始化:为类以及变量赋予真正的值
        使用:类的调用
        卸载:类的垃圾回收

java 虚拟机主要分为以下几个区

1. 方法区 1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生
GC,在这里进行的 GC 主要是对方法区里的常量池和对类型的卸载
2. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译
器编译后的代码等数据。
3. 该区域是被线程共享的。
4. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。
该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也
会存在这个常量池中。
2. 虚拟机栈
1. 虚拟机栈也就是我们平常所称的栈内存,它为 java 方法服务,每个方法在执行
的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口
等信息。
2. 虚拟机栈是线程私有的,它的生命周期与线程相同。
3. 局部变量表里存储的是基本数据类型、returnAddress 类型(指向一条字节码
指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,
也有可能是代表对象的句柄或者与对象相关联的位置。局部变量所需的内存空间在
编译器间确定
4. 操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量
表通过索引来访问,而是压栈和出栈的方式
5. 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引
用是为了支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在
运行期转化为直接引用。
3. 本地方法栈 本地方法栈和虚拟机栈类似,只不过本地方法栈为 Native 方法服务。
4.
java 堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实
例都在这里创建,因此该区域经常发生垃圾回收操作。
5. 程序计数器:
内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的
字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数
器完成。该内存区域是唯一一个 java 虚拟机规范没有规定任何 OOM 情况的区
域。
https://openjdk.org/jeps/122   介绍 静态变量、字符串常量从永久代移动到堆中
  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java虚拟机(JVM内存模型是JVM用于管理Java程序运行时内存的一种机制。JVM内存划分为不同的区域,每个区域都有自己的用途和生命周期。这些区域包括: 1. 程序计数器(Program Counter Register):程序计数器是一块较小的内存区域,它用于记录当前线程所执行的字节码指令的地址。每个线程都有一个独立的程序计数器。 2. Java虚拟机栈(Java Virtual Machine Stacks):Java虚拟机栈是线程私有的,它用于存储Java方法执行时的局部变量、操作数栈、动态链接、方法出口等信息。 3. 本地方法栈(Native Method Stack):本地方法栈与Java虚拟机栈类似,但是它是为本地方法服务的。 4. Java堆(Java Heap):Java堆是Java虚拟机管理的内存中最大的一块。Java对象实例和数组都在堆上分配内存。堆是所有线程共享的一块内存区域。 5. 方法区(Method Area):方法区是用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 6. 运行时常量池(Runtime Constant Pool):运行时常量池是方法区的一部分,用于存放编译器生成的字面量和符号引用。 7. 直接内存(Direct Memory):直接内存不是JVM运行时数据区的一部分,但是它也可以被JVM所管理。在使用NIO(New IO)时,可以使用直接内存来提高IO性能。 以上就是JVM内存模型的主要区域。JVM内存模型的划分对于Java程序的运行和调优都非常重要。在实际开发中,需要根据具体情况调整JVM内存的配置,以达到更好的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值