如何创建个人网站,网站建设网站定制,开发板的作用,idea怎么做网页本系列会持续更新。
JVM基本是BAT面试必考的内容#xff0c;今天我们先从JVM内存模型开启详解整个JVM系列#xff0c;希望看完整个系列后#xff0c;可以轻松通过BAT关于JVM的考核。
BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃圾回收算法 3.JVM垃圾回收器 4.JVM参数详解 5…本系列会持续更新。
JVM基本是BAT面试必考的内容今天我们先从JVM内存模型开启详解整个JVM系列希望看完整个系列后可以轻松通过BAT关于JVM的考核。
BAT必考JVM系列专题
1.JVM内存模型 2.JVM垃圾回收算法 3.JVM垃圾回收器 4.JVM参数详解 5.JVM性能调优一、JVM内存结构 jdk 1.7之前常量池是存放在方法区中 方法区与堆是独立的从这张内存图中也能看出来。jdk 1.7常量池从方法区中移到了堆中属于堆内存的一部分。Java8移除了方法区并由元空间metaspace代替存放在本地内存native space中。并没有对常量池再做变动。 jdk1.8中永久代被元数据替换类的属性静态变量常量方法等都存储在元数据区但是字符串常量池实际上是保存在堆中的。你可以打印一下常量池字符串中的信息是在堆内存的 由上图可以清楚的看到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来设定永久代最大可分配的内存空间默认大小是64M64位JVM默认是85M。
随着JDK8的到来JVM不再有 永久代(PermGen)。但类的元数据信息metadata还在只不过不再是存储在连续的堆空间上而是移动到叫做“Metaspace”的本地内存Native memory。
方法区或永生代相关设置
-XX:PermSize64MB 最小尺寸初始分配-XX:MaxPermSize256MB 最大允许分配尺寸按需分配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:ParallelGCThreads20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
典型JVM参数配置参考:
java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:ParallelGCThreads20-XX:UseConcMarkSweepGC-XX:UseParNewGC
-Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个堆大小年轻代大小年老代大小持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大 小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000 左右。
如果觉得不错请点赞支持下。关注优知学院专栏【直通BAT】进阶Java架构师实战架构技术干货第一时间送达。
----end---- BAT必考题系列文章包含多线程、Redis、分布式架构等内容感兴趣不妨深入了解扩充知识栈往期文章
JVM性能调优的6大步骤及关键调优参数详解
7种JVM垃圾收集器特点优劣势、及使用场景
JVM的4种垃圾回收算法、垃圾回收机制与总结
深入剖析JVMG1收集器回收流程推荐用例