图灵学院 java架构师
SpringCloud开发中经常会出现一个非常严重的资源问题,就是内存占用过高,但是实际上,本机开发测试并没有很大的请求量,因此这是对计算机资源的严重浪费,甚至导致IDE卡死,崩溃。
由eureka,steam,sleuth,config,rabbit,oauth2和其他springcloud系列存储桶应用程序以及其他与业务相关的组件组成的单个服务可能需要占用1到1.5G的内存才能在12G内存计算机上启动。如果需要同时启动许多服务,则内存完全不足。
解决方法:
修改IDE针对每个项目的jvm参数。
这里以idea为例:
1.打开EditConfigurations
Idea右上角,如图:
2.参考如下配置:
左边如果是springcloud的话肯定是在springboot下,如果没有,可以点击左上角的+号手动添加,一般启动过的项目这里会有的。
关于jvm参数后面会讲。
这里要注意的是,register项目不需要太多资源(我这里设置128M),Gateway和config服务可以比register多一点(256M)。其它业务性服务才需要更多的资源(512M)。
请根据自己电脑配置情况调整,我的电脑是12G内存。
3.关于jvm配置
设置JVM内存的参数有四个:
-XmxJavaHeap最大值,默认值为物理内存的1/4,最佳设置值应取决于物理内存大小和计算机中的其他内存开销;
-XmsJavaHeap的初始值,服务器JVM应该将-Xms和-Xmx设置为相同的值,并且开发测试机的JVM可以保留默认值。
-XmnJavaHeapYoung区域大小,如果您不熟悉它,最好保留默认值;
-Xss每个线程的堆栈大小,如果您不熟悉它,最好保留默认值;
一般用到最多的是
-Xms512m设置JVM使内存为512m。可以将此值设置为与-Xmx相同,以避免在每次垃圾回收之后JVM重新分配内存。
-Xmx512m,将JVM的最大可用内存设置为512M。
-Xmn200m:将年轻代大小设置为200M。整个堆大小=年轻代大小,旧代大小和持久代大小。永久代通常具有64m的固定大小,因此在增加年轻代后,老一代的大小将减小。此值对系统性能有较大影响。Sun正式建议配置整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。在JDK5.0之后,每个线程的堆栈大小为1M,之前的每个线程的堆栈大小为256K。调整线程所需的内存大小以用于更多应用程序。在相同的物理内存下,减小此值可以生成更多线程。但是,操作系统对进程中的线程数仍然有限制,不能无限生成。经验值在3000〜5000左右。
效果
效果很明显
12G内存启动了14个服务和其他各种软件(idea3个),内存占用如下图: