深入详解JVM内存模型与JVM参数详细配置
JVM内存布局 由上图可以清晰的看到JVM的内存空间分为3大部门:
个中栈内存可以再细分为java假造机栈和当处所法栈,堆内存可以分别为新生代和晚年月,新生代中还可以再次分别为Eden区、From Survivor区和To Survivor区。 个中一部门是线程共享的,包罗 Java 堆和要领区;另一部门是线程私有的,包罗假造机栈和当处所法栈,以及措施计数器这一小部门内存。 堆内存(Heap) 对付大大都应用来说,Java 堆(Java Heap)是Java 假造机所打点的内存中最大的一块。Java 堆是被全部线程共享的一块内存地区,在假造机启动时建设。 此内存地区的独一目标就是存下班具实例,险些全部的工具实例都在这里分派内存。 堆内存是全部线程共有的,可以分为两个部门:年青代和晚年月。 下图中的Perm代表的是永世代,可是留意永世代并不属于堆内存中的一部门,同时jdk1.8之后永世代已经被移除。 新生代 ( Young ) 与晚年月 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ) 默认的,Eden : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间巨细,from = to = 1/10 的新生代空间巨细。 要领区(Method Area) 要领区也称"永世代",它用于存储假造机加载的类信息、常量、静态变量、是各个线程共享的内存地区。 在JDK8之前的HotSpot JVM,存放这些”永世的”的地区叫做“永世代(permanent generation)”。永世代是一片持续的堆空间,在JVM启动之前通过在呼吁行配置参数-XX:MaxPermSize来设定永世代最大可分派的内存空间,默认巨细是64M(64位JVM默认是85M)。 跟着JDK8的到来,JVM不再有 永世代(PermGen)。但类的元数据信息(metadata)还在,只不外不再是存储在持续的堆空间上,而是移动到叫做“Metaspace”的当地内存(Native memory。 要领区或长生代相干配置
假造机栈(JVM Stack) 描写的是java要领执行的内存模子:每个要领被执行的时辰城市建设一个"栈帧",用于存储局部变量表(包罗参数)、操纵栈、要领出口等信息。每个要领被挪用到执行完的进程,就对应着一个栈帧在假造机栈中从入栈到出栈的进程。 当处所法栈(Native Stack) 当处所法栈(Native Method Stacks)与假造机栈所施展的浸染长短常相似的,其区别不外是假造机栈为假造机执行Java要领(也就是字节码)处事,而当处所法栈则是为假造机行使到的Native要领处事。 措施计数器(PC Register) 措施计数器是用于标识当前列程执行的字节码文件的行号指示器。多线程环境下,每个线程都具有各自独立的措施计数器,以是该地区长短线程共享的内存地区。 当执行java要领时辰,计数器中生涯的是字节码文件的行号;当执行Native要领时,计数器的值为空。 直接内存 直接内存并不是假造机内存的一部门,也不是Java假造机类型中界说的内存地区。jdk1.4中新插手的NIO,引入了通道与缓冲区的IO方法,它可以挪用Native要领直接分派堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的巨细。 JVM内存参数配置
典范JVM参数设置参考:
-Xmx3550m:配置JVM最大可用内存为3550M。 -Xms3550m:配置JVM促使内存为3550m。此值可以配置与-Xmx沟通,以停止每次垃圾接纳完成后JVM从头分派内存。 -Xmn2g:配置年青代巨细为2G。整个堆巨细=年青代巨细+大哥代巨细+耐久代巨细。耐久代一样平常牢靠巨细为64m,以是增大年青代后,将会减小大哥代巨细。此值对体系机能影响较大,官方保举设置为整个堆的3/8。 -Xss128k:配置每个线程的仓库巨细。JDK5.0往后每个线程仓库巨细为1M,早年每个线程仓库巨细为256K。更具应用的线程所需内存大 小举办调解。在沟通物理内存下,减小这个值能天生更多的线程。可是操纵体系对一个历程内的线程数照旧有限定的,不能无穷天生,履历值在3000~5000 阁下。 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |