使用maven时,如何修改JVM的配置参数;maven命令执行时到底消耗多少内存?

maven是使用java启动的,因此依赖JVM,那么如何修改JVM参数?

MAVEN_OPTS

在系统的环境变量中,设置MAVEN_OPTS,用以存放JVM的参数,具体设置的步骤,参数示例如下:

  MAVEN_OPTS=-Xms256m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256M

  或者临时设置 export MAVEN_OPTS=-Xms256m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256M

在mvn中添加MAVEN_OPTS

找到Maven的安装目录,在bin目录下,编辑mvn.bat(linux下,mvn)

  set MAVEN_OPTS=-Xms256m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256M

Vim mvn:

设置JVM最大堆heap内存为一个很小的值5m,如图,报错:GC overhead limit exceeded

查看详细信息:OOM了

关于下图标识的含义: 27M表示构建结束的时刻所使用的堆heap大小;535M表示构建结束时刻的分配的堆大小

分配的堆大小需要 > 使用的堆大小,不然就会内存溢出OOM

Here :

Final Memory: 47M/535M

47M is the used memory and 535M the current allocated memory (heap size) by the JVM at the end of the build.
But these information could not give you the peak value.

Why the used memory (43M) cannot be considered as the peak ?

  • Because the peak may have occurred before the end of the build.

Why the heap size (636M) cannot be considered as the peak ?

  • Because the peak may be superior to the heap size if the GC reduced the heap size between the peak and the end of the build .
    It may be the case for a very long build that performs intensive tasks at the beginning and lighter tasks then.
  • Because the peak may be inferior to the heap size if the GC has increased the heap size until this value but the application never needs to consume as much as memory.

To get the memory peak during the execution of the maven build, monitor the Java application (maven execution) with any JVM tool designed for : JVisualVM or JConsole for example.

Here‘s an screenshot of a maven build of a Spring Boot application monitored by JVisualVM that shows that neither the heap size or the used size at the end of build are the peak value :

JVisualVM is the best as it can be used to monitor several processes at once. And when running the maven build, make sure to open(double click) the relevant processes generated under the Applicationwindow of the JVisualVM as the build processes are killed once after the built is completed making you unable to monitor the process. By opening the relevant process before it is being killed, will allow to monitor the build process well.

Yes, and if you have e.g. unit tests, the surefire plugin starts parallel an additional process without using MAVEN_OPTS for that.

maven的单元测试插件会另外起个进程,这个进程的堆大小不受MAVEN_OPTS的配置约束,所有说maven命令行执行,内存到底够不够,关键看两个参数,一个是主进程的堆heap的峰值peak;一个是单测插件surefire起的进程的所需堆heap的峰值peak。因为一个项目有多个模块moduls,那就得看最消耗heap的那个模块的峰值peak

如下图所示,会在某个时刻出现一个所需堆heap的极值,如果系统不能满足这个大小,就会OOM(out of memory)内存溢出

另外surefire插件到底可以jvm再拉出几个进程,以及每个进程的jvm配置是如何的,都是可以配置的,参考:http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html

还有就是surefire可以不另起进程,这样减少内存的使用,见插件官网说明

至于配置几个并行进程,就要看设备内存已经项目执行时间要求。要么时间换空间,要么空间换时间。Choosing the right forking strategy and parallel execution settings can have substantial impact on the memory requirements and the execution time of your build system.

export MAVEN_OPTS=-Xmx512m这个参数的左右是,可以减少GC的压力

How do I interpret the "Final Memory" reported by Maven? "66M/188M" for
example, what does each of the figures mean?

In general the JVM only looks for more memory (up to -Xmx) when it needs
it, so consider that to be the peak requirement (not peak usage as the JVM
will always ask for more than usage on the basis that it needs room to
allocate objects)

If you run Maven with -Xmx2048m you will remove the pressing need for GC,
but the total memory might still only be 188MB as that may just have been
the largest amount of that 2048MB that the JVM needed at some point in time
during the build

参考:

1、http://grokbase.com/t/maven/dev/12bvc2s2bt/final-memory-reported-by-maven

2、https://stackoverflow.com/questions/45418317/how-to-find-the-peak-memory-usage-in-a-maven-build?answertab=votes#tab-top

3、http://maven.apache.org/surefire/maven-surefire-plugin/

原文地址:https://www.cnblogs.com/shengulong/p/8318802.html

时间: 2024-10-07 11:11:20

使用maven时,如何修改JVM的配置参数;maven命令执行时到底消耗多少内存?的相关文章

深入理解JVM一配置参数

一.JVM配置参数分为三类参数: 1.跟踪参数 2.堆分配参数 3.栈分配参数 这三类参数分别用于跟踪监控JVM状态,分配堆内存以及分配栈内存. 二.跟踪参数 跟踪参数用于跟踪监控JVM,往往被开发人员用于JVM调优以及故障排查. 1.当发生GC时,打印GC简要信息 使用-XX:+PrintGC或-verbose:gc参数 这两个配置参数效果是一样的,都是在发生GC时打印出简要的信息,例如执行代码: 1: public static void main(String[] args) 2: { 3

忘记root密码时如何修改密码?如何解决进入root权限时出现的XXis not in the sudoers file. this incident will be reported.问题。

当出现这种情况时,可以用如下方法解决. 首先重启虚拟机,当出现如下界面时,将鼠标进入Linux系统,一定要在这三秒内按下回车键. 进入如下界面 按e之后,会进入如下界面 用上下键跳至第二行,按e进入编辑模式后,在最后输入single.(注意,这里single之前一定要有空格) 之后按b重启,修改密码 这样就可以进入root模式了. 但是随后输入exit退出之后,又出现了用户不在sudoers文件的问题. 怎么解决呢? 首先输入su - 输入超级管理员密码之后,就会切换到root用户(注意,-不要

Linux--- MySQL中GRANT命令执行时发生root权限报错及解决方法

好不容易解决了root用户密码登录的问题,在给新建用户test1授权时出现了如下报错,提示root权限问题: mysql> GRANT ALL ON *.* TO 'test1'@'localhost' IDENTIFIED BY '123456';  ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 查了网上很多方法说# mysqld_safe -u mysql --skip-

Maven 工程下 Spring MVC 站点配置 (三) C3P0连接池与@Autowired的应用

Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 前两篇文章主要是对站点和数据库操作配置进行了演示,如果单单实现这两个需求的话,那么基本足够,但是很多时候一个网站除了仅仅能够访问数据库是不够的,它还需要对性能以及更简化的步骤有着更多的要求,这一篇重点就是帮助我们如何去实现数据连接池管理与更简化便利的开发步骤. 如果你觉得自己能写出更高效率的连接池,那你可以不需要这篇文章了,我更建议你可以去开源组织毛遂自

1.java应用jvm原理及参数调优

什么是jvm? 虚拟机 ,字节码,平台无关 jvm是按照运行时数据的存储结构来划分内存结构的,jvm在运维java程序时,将它们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据.运行时数据包括java程序本身的数据信息和jvm运行java需要的额外数据信息. jvm堆配置参数 1  -Xms 初始堆大小 默认物理内存的1/641(<1g) 2  -Xms 最大堆大小 默认物理内存的1/4(<1GB),实际中建议不大于4G. 3 一般建议设置 -Xms= -Xmx 好处

flume配置参数的意义

1.监控端口数据: flume启动: [[email protected] flume]$ bin/flume-ng agent --conf conf/ --name a1 --conf-file job/flume-telnet-logger.conf -Dflume.root.logger=INFO,console 参数说明: --conf conf/  :表示配置文件存储在conf/目录 --name a1 :表示给agent起名为a1 --conf-file job/flume-tel

Shell执行时显示指令本身&amp;&amp;显示shell指令

shell脚本如何显示所执行的每一条命令,例如执行一个bash脚本时,只看到了各个命令的执行结果,但是没有看到具体的命令 #!/bin/bash ls #end 这个脚本执行时,并不打印命令'ls' 怎么样才能让其先打印出所执行的命令,在执行命令呢? 1.方法一 在脚本中设置-x参数,让命令执行时打印其命令本身和参数,如: #!/bin/bash set -x ls #end 运行结果 + ls 2.方法二 除了方法一的作用外,输出还会原封不动的打印执行后的每一条指令,如: #!/bin/bas

实现一个支持运行时并发修改配置生效的Configuration类

可配置性是一个好的应用程序的重要指标.我们常常需要实现类似能够运行时修改配置的功能.最近在开发一个中间层的服务程序,最终发布的方式是把代码打成jar包交给调用方使用.这个中间层服务需要一些配置信息,考虑了一下有几个基本的需求: 1. 在ja包中提供一个service-defalut.properties配置文件来提供全部的默认配置.这样的好处是尽量减少对调用方的侵入.调用方可以不提供额外的配置. 2. 调用方也可以提供一个service-site.properties配置文件来提供自定义的配置信

eclipse创建maven项目时如何修改web的版本和jdk的版本

在使用eclipse创建maven项目的时候,默认的web.xml的版本时2.3,默认jre的版本时1.5,有时候我们需要修改一些高的版本 1.首先找到项目下面的.settings下面的org.eclipse.wst.common.project.facet.core.xml文件 2.修改里面的文件为我们需要的jdk和web的版本 3.在我们的maven项目的pom文件里面添加编译插件 <build> <finalName>SSM</finalName> <plu