java内存结构、内存调优

本文详细介绍了JVM运行时数据区的五个部分:程序计数器、虚拟机栈、本地方法栈、堆和方法区。深入解析了每个部分的作用、线程隔离与共享特性,以及堆内存的划分与调优策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM 运行时数据区

根据 JVM 规范,JVM 运行时数据区共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。其中PC寄存器、java虚拟机栈和本地方法栈是每一个线程隔离的。java堆和方法区是所有线程共享的。
在这里插入图片描述
程序计数器
线程私有。PC寄存器(PC Register)的一种。当前线程执行java代码时,指向下一条要执行的指令。

本地方法栈
线程私有。这部分主要与虚拟机用到的 Native 方法相关, Java 应用程序员并不需要关心这部分的内容。

虚拟机栈 Stack
线程私有,随着线程的创建而创建。存储局部变量表、操作栈、动态链接、方法出口,对象指针。

堆 Heap
线程共享。所有的对象实例以及数组都要在堆上分配。垃圾收集器(GC)在该区域回收内存空间。

方法区 Method Area
线程共享。主要用于存储类的信息、静态变量、常量池、方法数据、方法代码、即时编译器编译后的代码等。

堆内存划分

JDK8以前。堆内存通常被分为三块区域:新生代(young generation)、老生代(old generation)、永久代(Permanent Generation for VM Matedata),如图:
在这里插入图片描述

新生代 Eden区
新对象或者生命周期很短的对象会存储在这个区域中。新生代GC会清理这一区域。这个区的大小可以通过-XX:NewSize-XX:MaxNewSize参数来调整

新生代 Survivor区
有两个,并且总有一个是空着的。那些历经了Eden区的垃圾回收仍能存活下来的的对象会存到其中一个区域。Survivor区的大小可以由JVM参数-XX:SurvivorRatio来进行调节。

Old Generation老年代
那些在历经了Eden区和Survivor区的多次GC后仍然存活下来(达到一定年龄)的对象或者新生代直接装不下的对象会存储在这个区里。这个区会由一个特殊的垃圾回收器来负责。老年代中的对象的回收是由老年代的GC(major GC)来进行的。

PermGen永久代
Java虚拟机HotSpot对JVM规范的方法区的一种实现。存放着类的相关信息、类的静态变量、对象的方法、变量等元数据信息。Java8中把存放类的元数据信息的永久代内存从堆内存中移到了叫做元空间Metaspace的本地内存(Native memory)中。原因是PermGen很难调整。应该为PermGen分配多大的空间很难确定,因为PermSize的大小依赖于很多因素,比如JVM加载的class的总数,常量池的大小,方法的大小等。PermGen中类的元数据信息在每次FullGC的时候可能会被收集,但成绩很难令人满意。

在这里插入图片描述

元空间Metaspace
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。

内存调优

内存调优,无非就是通过修改它们各自的内存空间的大小,使应用能够更加合理、高效地使用内存

堆设置

-Xms: 初始堆大小
-Xmx: 最大堆大小
-XX: NewSize=n: 设置年轻代大小
-XX: NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX: SurvivorRatio=n: 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden: Survivor=3: 2,一个Survivor区占整个年轻代的1/5
-XX:MaxTenuringThreshold: 设置进入老年代的年龄
-XX: PermSize=n: 设置持久代初始大小
-XX: MaxPermSize=n: 设置持久代最大大小

元空间设置
-XX:MetaspaceSize:元空间初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

-XX:MaxMetaspaceSize:设置元空间最大内存,默认是没有限制的。如果设置的元内存空间过小,应用程序可能得这个错误:java.lang.OutOfMemoryError: Metadata space

-XX:MinMetaspaceFreeRatio:在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集

-XX:MaxMetaspaceFreeRatio:在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

垃圾回收策略调优

Java虚拟机的垃圾回收策略一般分为:串行收集器、并行收集器和并发收集器。

串行收集器:

1、 -XX:+UseSerialGC :代表垃圾回收策略为串行收集器,即在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,主要在JDK1.5之前的垃圾回收方式。

并发收集器:

1、 -XX:+UseParallelGC :代表垃圾回收策略为并行收集器(吞吐量优先),即在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式。此配置仅对年轻代有效。该配置只能让年轻代使用并发收集,而年老代仍旧使用串行收集 。

2、 -XX:ParallelGCThreads=4 :配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

3、-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集 。

4、 -XX:MaxGCPauseMillis=100 :设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

5、 -XX:+UseAdaptiveSizePolicy :设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值