jvm学习笔记(一) ----- JAVA 内存

JAVA 内存

链接: jvm学习笔记(二) ----- 垃圾回收

链接: jvm学习笔记(三) ----- 垃圾回收器

一、程序计数器

  1. 虚拟机需要通过『程序计数器』记录指令执行到哪了。
  2. 线程要轮流使用 CPU 时间片,因此需要『程序计数器』来记住正在执行的字节码的地址。例如 线程 A 的计数器记录当前执行到了第三行字节码,这时候时间片用完了,CPU 切换到其它线程运行,当 CPU 再次切换到 线程 A 时,它就会从计数器得知上次执行的代码位置,继续向下运行。

二、虚拟机栈

  1. 作用: 一个线程使用的内存大小。线程内调用一次方法,就会产生一个栈帧,栈帧内包含方法内局部变量,方法参数,返回地址等。多个栈帧合称为『栈』,而正在执行的方法称为『活动栈帧』,一个线程内同一时刻只能有一个『活动栈帧』
  2. 配置:
java 复制代码
-Xss

The default value depends on the platform: 
* Linux/x64 (64-bit): 1024 KB 
* macOS (64-bit): 1024 KB 
* Oracle Solaris/x64 (64-bit): 1024 KB 
* Windows: The default value depends on virtual memory
*
  1. 特点:
    • 方法执行完毕,栈帧内存即被释放
    • 因为线程私有,不存在共享,因此线程安全
    • 值越大,会让线程数更少
  2. 栈内存溢出情况
    • 栈太小,方法调用过深(栈帧太多)
    • 栈太小,方法内局部变量太多(栈帧太大)
  3. 测试代码如下:
java 复制代码
public class Demo1 {

    private static  int count = 0;

    public static void main(String[] args) {
        method1();
    }

    private static void method1() {
        count ++ ;
        System.out.println(count);
        method1();
    }

}

三、本地方法栈

  • 每个线程启动时,还会分配『本地方法栈』内存,来给哪些其它语言实现的方法(称为本地方法)使用。
    +

四、堆

  1. Java堆通常是Java虚拟机所管理的内存中最大的一块。Java堆是被锁有线程共享的一块内存区域,在虚拟机启动时创建。这块区域唯一的目的就是存放对象实例,几乎所有对象实例及数组都在该区域分配内存,从 JDK1.7 开始,StringTable等也会使用堆内存。
  2. Java堆时垃圾收集器管理的主要区域(GC堆),从内存回收的角度(收集器一般采用分代收集算法),堆被划分为新生代和旧生代,新生代又被进一步划分为Eden(伊甸园) 和 Survivor(幸存区) 区,最后Survivor由FromSpace和ToSpace组成,结构图如下所示:
  3. 堆空间内存分配(默认情况下)
  • 老年代 : 三分之二的堆空间

  • 年轻代 : 三分之一的堆空间

  • eden区: 8/10 的年轻代空间

  • survivor From : 1/10 的年轻代空间

  • survivor To : 1/10 的年轻代空间

五、非JAVA内存(堆外内存)

1.元空间(Metaspace)

  1. 作用:用来存储类对象,类加载器,静态变量,StringTable,SymbolTable,即时编译器生成的代码等。

  2. 历史:

    1. 『方法区』是 Java VM 规范中定义的概念,具体实现根据各个虚拟机厂商的不同而不同。对于 Oracle 的 HotSpot 虚拟机来说,最初作为『方法区』的实现称之为『永久代』,从 Java 8 开始,『永久代』被替换为『元空间』。
    2. 『永久代』,垃圾回收仍然会考虑『永久代』,但回收效率不高,StringTable 最初也使用的是『永久代』内存,容易造成 OOM 问题。
    3. 『元空间』,使用了操作系统内存,默认没有上限。并且 StringTable 的空间被移至堆内存,『元空间』中仅存储类加载器、类对象等信息,垃圾回收不用考虑『元空间』,元空间自己管理内存释放。

2.直接内存

  1. 定义:在 NIO 进行 IO 操作时,用到的数据缓冲内存 DirectBuffer
  2. 特点:典型实现由 DirectByteBuffer,它使用了堆外内存,可以用 allocateDirect 方法创建
  3. 好处:
    • 没有使用堆内存,减少 GC 压力
    • I/O 读写操作直接操作堆外内存,省去了系统空间和用户空间的数据拷贝
    • 堆外内存回收通过虚引用实现
相关推荐
m0_748554812 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
lee_curry3 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
码途漫谈3 小时前
Easy-Vibe开发篇阅读笔记(四)——前端开发之结合 Agent Skills 美化界面
人工智能·笔记·ai·开源·ai编程
酿情师3 小时前
yihan:一款面向连续网页学习的智能侧边栏插件
学习·学习方法·工具·学习工具
阿正呀4 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
2501_901200534 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
瞎某某Blinder4 小时前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法
金銀銅鐵5 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
m0_495496415 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
love在水一方5 小时前
VLN 入门学习计划 —— 基于 InternNav
学习