一、介绍:
由上图可以清楚的看到JVM的内存空间分为3大部分:
堆内存:新生代、老年代
方法区:属于永久代,用于存放静态文件,如Java类、方法等
栈内存:java虚拟机栈、本地方法栈
其中新生划分为Eden区、From Survivor区和To Survivor区,存放所有新生成的对象。而老年代指在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象。
二、线程共享:java堆和方法区;
线程私有:栈(java虚拟机栈和本地方法栈 )
三、堆内存:
Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块,目的就是存放对象实例。
新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2。
四、方法区:
方法区也称"永久代",它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。
永久代是一片连续的堆空间,在JVM启动前通过命令行设置参数-XX:MaxPermSize设定分配的内存空间。但是JDK8以后,不再有永久代,类的元数据信息异动到叫做“Metaspace”的本地内存。
五、虚拟机栈 JVM Stack
描述的是java方法执行的内存模型:每个方法被执行会创建一个“栈帧”,用于存储局部变量表、操作栈、方法出口等信息。执行完,对应一个栈帧草从虚拟机中入栈到出站过程。
六、JVM内存参数设置
-Xms设置堆的最小空间大小。
-Xmx设置堆的最大空间大小。
-Xmn:设置年轻代大小
-XX:NewSize设置新生代最小空间大小。
-XX:MaxNewSize设置新生代最大空间大小。
-XX:PermSize设置永久代最小空间大小。
-XX:MaxPermSize设置永久代最大空间大小。
-Xss设置每个线程的堆栈大小
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。