LINUX系统 每个进程虚拟内存的分区堆区malloc等申请的动态内存栈区局部变量入参出参等代码段程序编译后的二进制指令数据段静态变量、全局变量内存映射段mmap sendFile 等内存映射内核空间系统内核代码内核数据用户态不可见JVM其实就是LINUX的一个进程。然后jvm又对内存进行了jvm自己的划分。但是jvm其实就是一个c程序运行也需要内存这部分直接向操作系统申请的不归jvm管理的叫做本地内存直接内存:用来做内存映射 mmap sendFilejvm内存分为以下几个部分JVM内存结构堆区存放new出来的对象放在虚拟内存的堆区虚拟机栈 每个线程有自己的虚拟机栈线程每调用一个方法会向其虚拟机栈 放入方法的栈帧方法调用完成弹出栈帧。用于保存和恢复现场,放在虚拟内存的栈区本地方法栈调用其他native方法 C/C 等非 Java 语言编写的方法例如Object 类中的 hashCode()、wait()、notify() 等方法它们都有 native 关键字修饰其具体实现就在本地方法库中。native方法不受jvm控制本地方法栈主要为了native方法的保存现场和恢复现场放在虚拟内存的栈区方法区存放类的元数据静态变量的引用静态变量对象本身在堆区等信息jdk8之前在堆区永久代jdk8之后在元空间虚拟内存的内存映射段主要是因为jvm堆区空间固定配置死的但是内存映射段归linux系统管理更有弹性常量池属于方法区的一部分程序计数器记录当前线程执行指令的行号存放于虚拟内存的寄存器或者栈区标量替换如果一个封装对象不作为入参出参作用域只是在方法内部优化器会直接使用标量替换优化把 对象的属性拆出来当做基本类型直接放在栈区不会在堆区创建对象 如果这个对象特别大也不会标量替换的