java内存组成介绍堆(Heap)和非堆(Nonheap)内存 按照官方的说法Java 虚拟机具有一个堆堆是运行时数据区域所有类实例和数组的内存均从此处分配堆是在 Java 虚拟机启动时创建的在JVM中堆之外的内存称为非堆内存(Nonheap memory)可以看出JVM主要管理两种类型的内存堆和非堆简单来说堆就是Java代码可及的内存是留给开发人员使用的非堆就是JVM留给 自己用的所以方法区JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)每个类结构(如运行时常数池字段和方法数据)以及方法和构造方法 的代码都在非堆内存中 组成图 ◆ 方法栈&本地方法栈 线程创建时产生方法执行时生成栈帧 ◆ 方法区 存储类的元数据信息 常量等 ◆ 堆 java代码中所有的new操作 ◆ native Memory(C heap) Direct Bytebuffer JNI Compile GC; 堆内存分配 JVM初始分配的内存由Xms指定默认是物理内存的/;JVM最大分配的内存由Xmx指 定默认是物理内存的/默认空余堆内存小于%时JVM就会增大堆直到Xmx的最大限制空余堆内存大于%时JVM会减少堆直到 Xms的最小限制因此服务器一般设置XmsXmx相等以避免在每次GC 后调整堆的大小对象的堆内存由称为垃圾回收器的自动内存管理系统回收 非堆内存分配 JVM使用XX:PermSize设置非堆内存初始值默认是物理内存的/;由XX:MaxPermSize设置最大非堆内存的大小默认是物理内存的/ JVM内存限制(最大值) JVM内存的最大值跟操作系统有很大的关系简单的说就位处理器虽然 可控内存空间有GB但是具体的操作系统会给一个限制这个限制一般是GBGB(一般来说Windows系统下为GGLinux系统 下为GG)而bit以上的处理器就不会有限制了 |