加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

深入详解JVM内存模型与JVM参数详细配置

发布时间:2018-11-14 13:08:04 所属栏目:站长百科 来源:佚名
导读:JVM内存布局 由上图可以清晰的看到JVM的内存空间分为3大部门: 堆内存 要领区 栈内存 个中栈内存可以再细分为java假造机栈和当处所法栈,堆内存可以分别为新生代和晚年月,新生代中还可以再次分别为Eden区、From Survivor区和To Survivor区。 个中一部门是线

 JVM内存布局

深入详解JVM内存模子与JVM参数具体设置

由上图可以清晰的看到JVM的内存空间分为3大部门:

  1. 堆内存
  2. 要领区
  3. 栈内存

个中栈内存可以再细分为java假造机栈和当处所法栈,堆内存可以分别为新生代和晚年月,新生代中还可以再次分别为Eden区、From Survivor区和To Survivor区。

个中一部门是线程共享的,包罗 Java 堆和要领区;另一部门是线程私有的,包罗假造机栈和当处所法栈,以及措施计数器这一小部门内存。

堆内存(Heap)

对付大大都应用来说,Java 堆(Java Heap)是Java 假造机所打点的内存中最大的一块。Java 堆是被全部线程共享的一块内存地区,在假造机启动时建设。

此内存地区的独一目标就是存下班具实例,险些全部的工具实例都在这里分派内存。

堆内存是全部线程共有的,可以分为两个部门:年青代和晚年月。

下图中的Perm代表的是永世代,可是留意永世代并不属于堆内存中的一部门,同时jdk1.8之后永世代已经被移除。

直通BAT必考题系列:深入详解JVM内存模子与JVM参数具体设置

新生代 ( 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。

要领区或长生代相干配置

  • -XX:PermSize=64MB 最小尺寸,初始分派
  • -XX:MaxPermSize=256MB 最大应承分派尺寸,按需分派
  • XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 配置垃圾不接纳
  • 默认巨细
  • -server选项下默认MaxPermSize为64m
  • -client选项下默认MaxPermSize为32m

假造机栈(JVM Stack)

描写的是java要领执行的内存模子:每个要领被执行的时辰城市建设一个"栈帧",用于存储局部变量表(包罗参数)、操纵栈、要领出口等信息。每个要领被挪用到执行完的进程,就对应着一个栈帧在假造机栈中从入栈到出栈的进程。

当处所法栈(Native Stack)

当处所法栈(Native Method Stacks)与假造机栈所施展的浸染长短常相似的,其区别不外是假造机栈为假造机执行Java要领(也就是字节码)处事,而当处所法栈则是为假造机行使到的Native要领处事。

措施计数器(PC Register)

措施计数器是用于标识当前列程执行的字节码文件的行号指示器。多线程环境下,每个线程都具有各自独立的措施计数器,以是该地区长短线程共享的内存地区。

当执行java要领时辰,计数器中生涯的是字节码文件的行号;当执行Native要领时,计数器的值为空。

直接内存

直接内存并不是假造机内存的一部门,也不是Java假造机类型中界说的内存地区。jdk1.4中新插手的NIO,引入了通道与缓冲区的IO方法,它可以挪用Native要领直接分派堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的巨细。

JVM内存参数配置

直通BAT必考题系列:深入详解JVM内存模子与JVM参数具体设置

  • -Xms配置堆的最小空间巨细。
  • -Xmx配置堆的最大空间巨细。
  • -Xmn:配置年青代巨细
  • -XX:NewSize配置新生代最小空间巨细。
  • -XX:MaxNewSize配置新生代最大空间巨细。
  • -XX:PermSize配置永世代最小空间巨细。
  • -XX:MaxPermSize配置永世代最大空间巨细。
  • -Xss配置每个线程的仓库巨细
  • -XX:+UseParallelGC:选择垃圾网络器为并行网络器。此设置仅对年青代有用。即上述设置下,年青代行使并发网络,而大哥代仍然行使串行网络。
  • -XX:ParallelGCThreads=20:设置并行网络器的线程数,即:同时几多个线程一路举办垃圾接纳。此值最好设置与处理赏罚器数量相称。

典范JVM参数设置参考:

  • java-Xmx3550m-Xms3550m-Xmn2g-Xss128k
  • -XX:ParallelGCThreads=20
  • -XX:+UseConcMarkSweepGC-XX:+UseParNewGC

-Xmx3550m:配置JVM最大可用内存为3550M。

-Xms3550m:配置JVM促使内存为3550m。此值可以配置与-Xmx沟通,以停止每次垃圾接纳完成后JVM从头分派内存。

-Xmn2g:配置年青代巨细为2G。整个堆巨细=年青代巨细+大哥代巨细+耐久代巨细。耐久代一样平常牢靠巨细为64m,以是增大年青代后,将会减小大哥代巨细。此值对体系机能影响较大,官方保举设置为整个堆的3/8。

-Xss128k:配置每个线程的仓库巨细。JDK5.0往后每个线程仓库巨细为1M,早年每个线程仓库巨细为256K。更具应用的线程所需内存大 小举办调解。在沟通物理内存下,减小这个值能天生更多的线程。可是操纵体系对一个历程内的线程数照旧有限定的,不能无穷天生,履历值在3000~5000 阁下。

【编辑保举】

  1. 关于“C++中引用不占内存”题目的进一步表明
  2. ECC内存和平凡内存有什么区别,有须要买ECC内存吗
  3. 存储器就是内存还包罗了寄存器?
  4. 通过设置Apache 2以节制赏识器缓存
  5. Linux体系真的很吃内存?
【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读