当前位置:Gxlcms > 数据库问题 > mysql 第三十一篇文章~jvm的知识与优化

mysql 第三十一篇文章~jvm的知识与优化

时间:2021-07-01 10:21:17 帮助过:23人阅读

一 简介: 今天咱们聊聊 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)

   

mysql 第三十一篇文章~jvm的知识与优化

标签:这就是我   操作   理论   lang   收集器   静态   xms   内存回收   基本   

人气教程排行