位置: 主页 > 奇幻城国际下载 >

JVM系列篇:深入详解JVM内存模型与JVM参数详细配

时间:70-01-01 08:00 来源:

本系列会持续更新。

JVM基础是BAT口试必考的内容,本日我们先从JVM内存模型开启详解全部JVM系列,盼望看完备个系列后,可以轻松经由过程BAT关于JVM的稽核。

BAT必考JVM系列专题

1.JVM内存模型

2.JVM垃圾收受接收算法

3.JVM垃圾收受接收器

4.JVM参数详解

5.JVM机能调优

一、JVM内存布局

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

堆内存

措施区

栈内存

此中栈内存可以再细分为java虚拟机栈和本地措施栈,堆内存可以划分为新生代和老年代,新生代中还可以再次划分为Eden区、From Survivor区和To Survivor区。

此中一部分是线程共享的,包括 Java 堆和措施区;另一部分是线程私有的,包括虚拟机栈和本地措施栈,以及法度榜样计数器这一小部分内存。

堆内存(Heap)

java 堆(Java Heap)是Java 虚拟机所治理的内存中最大年夜的一块。堆是被所有线程共享的区域,其实虚拟机启动时创建的。堆里面寄放的都是工具的实例(new 出来的工具都存在堆中)。

此内存区域的独一目的便是寄放工具实例(new的工具),险些所有的工具实例都在这里分配内存。

堆内存分为两个部分:年轻代和老年代。我们寻常所说的垃圾收受接收,主要收受接收的便是堆区。更细一点划分新生代又可划分为Eden区和2个Survivor区(From Survivor和To Survivor)。

下图中的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。

措施区或长生代相关设置

-XX:PermSize=64MB 最小尺寸,初始分配

-XX:MaxPermSize=256MB 最大年夜容许分配尺寸,按需分配

XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 设置垃圾不收受接收

默认大年夜小

-server选项下默认MaxPermSize为64m

-client选项下默认MaxPermSize为32m

虚拟机栈(JVM Stack)

java虚拟机栈是线程私有,生命周期与线程相同。创建线程的时刻就会创建一个java虚拟机栈。

虚拟机履行java法度榜样的时刻,每个措施都邑创建一个栈帧,栈帧寄放在java虚拟机栈中,经由过程压栈出栈的要领进行措施调用。

栈帧又分为一下几个区域:局部变量表、操作数栈、动态连接、措施出口等。

日常平凡我们所说的变量存在栈中,这句话说的不太严谨,应该说局部变量寄放在java虚拟机栈的局部变量表中。

java的8中基础类型的局部变量的值寄放在虚拟机栈的局部变量表中,假如是引用型的变量,则只存储工具的引用地址。

本地措施栈(Native Stack)

本地措施栈(Native Method Stacks)与虚拟机栈所发挥的感化是异常相似的,其差别不过是虚拟机栈为虚拟机履行Java措施(也便是字节码)办事,而本地措施栈则是为虚拟机应用到的Native措施办事。

法度榜样计数器(PC Register)

法度榜样计数器便是记录当火线程履行法度榜样的位置,改变计数器的值来确定履行的下一条指令,比如轮回、分支、措施跳转、非常处置惩罚,线程规复都是依附法度榜样计数器来完成。

Java虚拟机多线程是经由过程线程轮流切换并分配处置惩罚器履行光阴的要领实现的。为了线程切换能规复到精确的位置,每条线程都必要一个自力的法度榜样计数器,以是它是线程私有的。

直接内存

直接内存并不是虚拟机内存的一部分,也不是Java虚拟机规范中定义的内存区域。jdk1.4中新加入的NIO,引入了通道与缓冲区的IO要领,它可以调用Native措施直接分配堆外内存,这个堆外内存便是本机内存,不会影响到堆内存的大年夜小。

二、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

阁下。

感觉不错请点赞支持下。

----end----

以下是JVM系列文章聚拢,感兴趣不妨深入懂得,扩充常识栈:

JVM的4种垃圾收受接收算法、垃圾收受接收机制与总结

7种JVM垃圾网络器特征,好坏势、及应用处景

深入详解JVM内存模型与JVM参数具体设置设置设备摆设摆设

JVM机能调优的6大年夜步骤,及关键调优参数详解

深入剖析G1网络器+收受接收流程+保举用例

我是mike,10年+法度榜样员。曾先后就职于淘宝、隆重年夜、百度、携程 ,历任高档研发工程师、研发经理、架构师、奇迹部CTO。坚持写文1年多,原创内容靠近400篇,今朝粉丝总数7万+,主要分享:BAT口试、Java架构、招聘资讯等内容。进群179961551获取以下资料~

本文由奇幻城娱乐手机登陆❽原创或转载,如果侵犯了你的权益,请联系我们删除。

热门文章
最新文章

Copyright © 2002-2011 饼干族 版权所有