一 简介: 今天咱们聊聊 jvm内存调优
二 基础理论:
1 jvm 堆(heap)基本概念:
1 对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
2 Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,
2 组成成员
1 新生代
2 老年代
3 相关参数
-Xmx(JVM分配堆最大内存) -Xms(JVM初始分配的堆内存)
4 配置错误案例
将会抛出OutOfMemoryError异常。
1 jvm 非堆(no-heap)基本概念
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2 组成成员
1 永久代
3 相关参数
PermSize(JVM初始化分配的非堆大小) MaxPermSize(JVM最大分片的非堆大小)
1 jvm 直接内存映射基本概念
此概念是关于java nio引入的(内存映射文件),直接以native的方式分配内存,不受jvm管理。这种方式是为了提高网络和文件IO的效率,避免多余的内存拷贝而出现的。
2 相关参数
MaxDirectMemorySize(默认64m)
三 相关讲解
1 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。
可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,
所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中
2 堆内存分配
JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误
3 非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryErro
4 直接映射分配
DirectMemory 的默认大小是64m,并不接受jvm内存管理,最好设置最大内存值
五 mycat相关建议
建议堆内存适度大小,直接映射内存尽可能大,两种一起占据操作系统的1/2-2/3的内存。
下面以服务器16G内存为例,Mycat堆内存4G,非堆内存64m 直接内存映射6G,JVM参数如
- server -Xms4G –Xmx4G XX:MaxPermSize=64M -XX:MaxDirectMemorySize=6G
这就是我对java jvm调节的感想,不会开发确实困难,仅供参考
六 jvm常用命令
1 jmap -heap pid 查看gc使用情况 (JDK1.7)