• JVM内存模型及参数调优


    堆、栈、方法区概念区别

    1.堆
    堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。根据垃圾回收机制的不同,
    Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为新生代和老年代。其中新声带存放新生的对象或者年龄不大的
    对象,老年代则存放老年对象。新生代分为edn区、s0区、s1区,s0和s1也被称为from和to区域,他们是两块大小相等并且可以
    互相角色的空间。绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经
    过一次新生代回收,如果对 象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代.
    

    2.栈
    Java栈是一块线程私有的空间,一个栈,一般由三部分组成:局部变量表、操作数据栈和帧数据区
    局部变量表:用于报错函数的参数及局部变量
    操作数栈:主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间。
    帧数据区:除了局部变量表和操作数据栈以外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着
    访问常量池的指针,方便计程序访问常量池,另外当函数返回或出现异常时卖虚拟机子必须有一个异常处理表,方便发送异常
    的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。
    

    3.方法区
    Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。
    比如类的字段、方法、常量池等。方法区的大小决定系统可以保存多少个类。如果系统
    定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出的错误。方法区可以理解
    为永久区。
    

    Java内存结构

    1、	类加载子系统:负责从文件系统或者网络加载Class信息,加载的信息存放在一块称之方法区的内存空间。
    2、	方法区:就是存放类的信息、常量信息、常量池信息、包括字符串字面量和数字常量等。
    3、	Java堆:在Java虚拟机启动的时候建立Java堆,它是Java程序最主要的内存工作区域,几乎所有的对象实例都存放到
    Java堆中,堆空间是所有线程共享。
    4、	直接内存:JavaNio库允许Java程序直接内存,从而提高性能,通常直接内存速度会优于Java堆。读写频繁的场合可能会考虑使用。
    5、	每个虚拟机线程都有一个私有栈,一个线程的Java栈在线程创建的时候被创建,Java栈保存着局部变量、方法参数、同事Java的方法调用、
    返回值等。
    6、	本地方法栈,最大不同为本地方法栈用于本地方法调用。Java虚拟机允许Java直接调用本地方法(通过使用C语言写)
    7、	垃圾收集系统是Java的核心,也是不可少的,Java有一套自己进行垃圾清理的机制。
    8、	PC(Program Couneter)寄存器也是每个线程私有的空间, Java虚拟机会为每个线程创建PC寄存器,在任意时刻,
    一个Java线程总是在执行一个方法,这个方法称为当前方法,如果当前方法不是本地方法,PC寄存器总会执行当前正在被执行的指令,
    如果是本地方法,则PC寄存器值为Underfined,寄存器存放如果当前执行环境指针、程序技术器、操作栈指针、计算的变量指针等信息。
    9、	虚拟机核心的组件就是执行引擎,它负责执行虚拟机的字节码,一般户先进行编译成机器码后执行。
    

    虚拟机参数配置

    -XX:+PrintGC      每次触发GC的时候打印相关日志
    -XX:+UseSerialGC      串行回收
    -XX:+PrintGCDetails  更详细的GC日志
    -Xms               堆初始值
    -Xmx               堆最大可用值
    -Xmn               新生代堆最大可用值
    -XX:SurvivorRatio     用来设置新生代中eden空间和from/to空间的比例.
    

    Tomcat内存溢出在catalina.sh 修改JVM堆内存大小

    JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
    

    JVM参数调优总结

    • GC的时间足够的小
    • GC的次数足够的少
      要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,我们只能取其平衡。
      (1)针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值
      (2)年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代,比如年轻代,通过
      -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小
  • 相关阅读:
    js变量声明提前
    03通讯录(Block传值)
    03-Block
    03通讯录(搭建编辑界面)
    03通讯录(代理解耦)
    03通讯录(逆传)
    03通讯录
    源码0604-06-掌握-大文件断点下载(断点下载)
    源码0604-05-程序不死
    源码0604-02-了解-网页开发
  • 原文地址:https://www.cnblogs.com/Libbo/p/11462780.html
Copyright © 2020-2023  润新知