「java设置jvm内存」java配置jvm内存

博主:adminadmin 2023-03-20 07:08:10 413

今天给各位分享java设置jvm内存的知识,其中也会对java配置jvm内存进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java jvm内存可以设置多少

-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;

-Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

-Xmn Java Heap Young区大小,不熟悉最好保留默认值; -Xss 每个线程的Stack大小,不熟悉最好保留默认值;

2

2. 如何分配JVM内存设置:

(1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效): java -Xmx128m -Xms64m -Xmn32m -Xss16m Test (2)当在集成开发环境下(如eclipse)启动并使用JVM时:

a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配): -vmargs -Xms40m -Xmx256m

-vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m.

此处设置的参数值可以通过以下配置在开发工具的状态栏显示: 在eclipse根目录下创建文件options,文件内容为:org.eclipse.ui/perf/showHeapStatus=true

修改eclipse根目录下的eclipse.ini文件,在开头处添加如下内容: -debug options -vm javaw.exe

重新启动eclipse,就可以看到下方状态条多了JVM信息.

b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)

编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效) 选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m

选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

注:如果在同一开发环境中同时进行了b和c设置,则b设置生效,c设置无效,如:

开发环境的设置为:-Xmx256m,而类Test的设置为:-Xmx128m -Xms64m,则运行Test时生效的设置为: -Xmx256m -Xms64m

(3)当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效): a. 设置环境变量: 变量名:CATALINA_OPTS

变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m

3

b. 打开Tomcat根目录下的bin文件夹,编辑catalina.bat,将其中

的%CATALINA_OPTS%(共有四处)替换为:-Xmx128m -Xms64m -Xmn32m -Xss16m

关于设置Java虚拟机(JVM)的内存问题

最近做毕设时 遇到了一点小问题 在解析dblp xml文件时(该文件很大 最新版本为 MB) 老是报错

java lang OutOfMemoryError: Java heap space

最后通过查资料才知道 这是由于JVM堆内存不足造成的 JVM在启动动的时候一般会设置JVM Heap的值

其初始空间(即 Xms)是物理内存的 / 最大空间( Xmx)不可超过物理内存 在JVM中如果 %的时间是用于GC 且可用的Heap size 不足 %的时候将抛出此异常信息 出现这种问题可以通过修改JVM heap大小解决

点击(此处)折叠或打开

java Xms M Xmx M className

以上设置JVM初始化堆内存为 M 最大可用堆内存为 M

( )在命令行中设置的方法就如上面所述

( )在Eclipse中可以这样设置

在eclipse的 Run Run Configurations Arguments下的VM Arguments中设置

Xms M Xmx M

另外可以使用 java X查看其它JVM参数情况

点击(此处)折叠或打开

D:\workjava X

Xmixed mixed mode execution (default)

Xint interpreted mode execution only

Xbootclasspath:directories and zip/jar files separated by ;

set search path for bootstrap classes and resources

Xbootclasspath/a:directories and zip/jar files separated by ;

append to end of bootstrap class path

Xbootclasspath/p:directories and zip/jar files separated by ;

prepend in front of bootstrap class path

Xnoclassgc disable class garbage collection

Xincgc enable incremental garbage collection

Xloggc:file log GC status to a file with time stamps

Xbatch disable background pilation

Xmssize set initial Java heap size

Xmxsize set maximum Java heap size

Xsssize set java thread stack size

Xprof output cpu profiling data

Xfuture enable strictest checks anticipating future default

Xrs reduce use of OS signals by Java/VM (see documentation)

Xcheck:jni perform additional checks for JNI functions

Xshare:off do not attempt to use shared class data

Xshare:auto use shared class data if possible (default)

Xshare:on require using shared class data otherwise fail

The X options are non standard and subject to change without notice

可以通过java lang Runtime的一些方法查看jvm的内存使用情况

点击(此处)折叠或打开

System out println( Total Memory: + Runtime getRuntime() totalMemory() / ( * + MB )

System out println( Free Memory: + Runtime getRuntime() freeMemory() / ( * ) + MB )

System out println( Max Memory: + Runtime getRuntime() maxMemory() / ( * ) + MB )

maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存 以字节为单位

totalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小 也就是java虚拟机这个进程当时所占用的所有内存

freeMemory为当前jvm中没有使用的内存

附 jvm参数说明 (转自)

server:一定要作为第一个参数 在多个CPU时性能佳

Xms java Heap初始大小 默认是物理内存的 /

Xmx java heap最大值 建议均设为物理内存的一半 不可超过物理内存

XX:PermSize:设定内存的永久保存区初始大小 缺省值为 M (我用visualvm exe查看的)

XX:MaxPermSize:设定内存的永久保存区最大 大小 缺省值为 M (我用visualvm exe查看的)

XX:SurvivorRatio=   :生还者池的大小 默认是 如果垃圾回收变成了瓶颈 您可以尝试定制生成池设置

XX:NewSize: 新生成的池的初始大小 缺省值为 M

XX:MaxNewSize: 新生成的池的最大大小    缺省值为 M

如果 JVM 的堆大小大于 GB 则应该使用值 XX:newSize= m XX:MaxNewSize= m XX:SurvivorRatio= 或者将堆的总大小的 % 到 % 分配给新生成的池 调大新对象区 减少Full GC次数

+XX:AggressiveHeap 会使得 Xms没有意义 这个参数让jvm忽略Xmx参数 疯狂地吃完一个G物理内存 再吃尽一个G的swap

Xss 每个线程的Stack大小 Xss 这使得JBoss每增加一个线程(thread)就会立即消耗 M内存 而最佳值应该是 K 默认值好像是 k

verbose:gc 现实垃圾收集信息

Xloggc:gc log 指定垃圾收集日志文件

Xmn young generation的heap大小 一般设置为Xmx的 分之一

XX:+UseParNewGC 缩短minor收集的时间

XX:+UseConcMarkSweepGC 缩短major收集的时间 此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适

XX:userParNewGC 可用来设置并行收集【多CPU】

XX:ParallelGCThreads 可用来增加并行度【多CPU】

lishixinzhi/Article/program/Java/hx/201311/26103

如何设置Java虚拟机JVM启动内存参数

设置Java虚拟机JVM启动内存参数方法如下:

Tomcat修改TOMCAT_HOME/bin/catalina.bat,在[echo Using CATALINA_BASE: "%CATALINA_BASE%"] 上面加入,比如:

set JAVA_OPTS= -server -Xms1536m -Xmx1536m或者JAVA_OPTS="-server -Xms1536m -Xmx1536m",

服务器模式参数-server不加也可以 ,就变成

set JAVA_OPTS= -Xms1536m -Xmx1536m或者JAVA_OPTS=" -Xms1536m -Xmx1536m",

如何设置jvm内存

本文向大家简单介绍一下进行JVM内存设置几种方法,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JRE。如果只是运行Java程序,则JRE已足够;而JDK则只有开发人员才用到。这里将为大家介绍设置JVM内存分配的几招。

工具/原料

一台电脑

方法/步骤

-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;

-Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

-Xmn Java Heap Young区大小,不熟悉最好保留默认值; -Xss 每个线程的Stack大小,不熟悉最好保留默认值;

2. 如何分配JVM内存设置:

(1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效): java -Xmx128m -Xms64m -Xmn32m -Xss16m Test (2)当在集成开发环境下(如eclipse)启动并使用JVM时:

a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配): -vmargs -Xms40m -Xmx256m

-vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m.

此处设置的参数值可以通过以下配置在开发工具的状态栏显示: 在eclipse根目录下创建文件options,文件内容为:org.eclipse.ui/perf/showHeapStatus=true

修改eclipse根目录下的eclipse.ini文件,在开头处添加如下内容: -debug options -vm javaw.exe

重新启动eclipse,就可以看到下方状态条多了JVM信息.

b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)

编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效) 选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m

选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

注:如果在同一开发环境中同时进行了b和c设置,则b设置生效,c设置无效,如:

开发环境的设置为:-Xmx256m,而类Test的设置为:-Xmx128m -Xms64m,则运行Test时生效的设置为: -Xmx256m -Xms64m

(3)当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效): a. 设置环境变量: 变量名:CATALINA_OPTS

变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m

3

b. 打开Tomcat根目录下的bin文件夹,编辑catalina.bat,将其中

的%CATALINA_OPTS%(共有四处)替换为:-Xmx128m -Xms64m -Xmn32m -Xss16m

java(jvm)内存怎么设置。网上的看不懂啊。你还是告诉一步一步怎么操作吧,在线等

java本身的内存是没法设置的,只能设置java虚拟机或者运行java项目的服务器的内存,而前者是在开发工具中设置的,后者是在服务器的配置文件中进行设置的

你这个目测是启动jvm的东西报的错,应该是少了一个文件或者是文件路径错误,使工具启动jvm失败,与jvm的内存没有关系,如果有条件,推荐用eclipse

JVM内存设置

一个新上线java服务, 内存的设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢?

分析:

依据的原则是根据Java Performance里面的推荐公式来进行设置。

具体来讲:

Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍

永久代 PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。【永久区并不是老年代的1.2到1.5倍,而是FullGC后永久区的1.2到1.5倍 1.2x to 1.5x permanent generation space】

年轻代Xmn的设置为老年代存活对象的1-1.5倍。

老年代的内存大小设置为老年代存活对象的2-3倍。

BTW:

1、Sun官方建议年轻代的大小为整个堆的3/8左右, 所以按照上述设置的方式,基本符合Sun的建议。

2、堆大小=年轻代大小+年老代大小, 即xmx=xmn+老年代大小 。 Permsize不影响堆大小。

3、为什么要按照上面的来进行设置呢? 没有具体的说明,但应该是根据多种调优之后得出的一个结论。

如何确认老年代存活对象大小?

方式1 (推荐/比较稳妥):

JVM参数中添加GC日志,GC日志中会记录每次FullGC之后各代的内存大小,观察老年代GC之后的空间大小。可观察一段时间内(比如2天)的FullGC之后的内存情况,根据多次的FullGC之后的老年代的空间大小数据来预估FullGC之后老年代的存活对象大小(可根据多次FullGC之后的内存大小取平均值)

方式2: (强制触发FullGC, 会影响线上服务,慎用)

方式1的方式比较可行,但需要更改JVM参数,并分析日志。同时,在使用CMS回收器的时候,有可能不能触发FullGC(只发生CMS GC),所以日志中并没有记录FullGC的日志。在分析的时候就比较难处理。

BTW:使用jstat -gcutil工具来看FullGC的时候, CMS GC是会造成2次的FullGC次数增加。 具体可参见之前写的一篇关于jstat使用的文章

所以,有时候需要强制触发一次FullGC,来观察FullGC之后的老年代存活对象大小。

注:强制触发FullGC,会造成线上服务停顿(STW),要谨慎,建议的操作方式为,在强制FullGC前先把服务节点摘除,FullGC之后再将服务挂回可用节点,对外提供服务

在不同时间段触发FullGC,根据多次FullGC之后的老年代内存情况来预估FullGC之后的老年代存活对象大小

如何触发FullGC ?

使用jmap工具可触发FullGC

jmap -dump:live,format=b,file=heap.bin pid 将当前的存活对象dump到文件,此时会触发FullGC

jmap -histo:live pid 打印每个class的实例数目,内存占用,类全名信息.live子参数加上后,只统计活的对象数量. 此时会触发FullGC

具体操作实例:

以我司的一个RPC服务为例。

BTW:刚上线的新服务,不知道该设置多大的内存的时候,可以先多设置一点内存,然后根据GC之后的情况来进行分析。

初始JVM内存参数设置为: Xmx=2G Xms=2G xmn=1G

使用jstat 查看当前的GC情况。如下图:

YGC平均耗时: 173.825s/15799=11ms

FGC平均耗时:0.817s/41=19.9ms

平均大约10-20s会产生一次YGC

看起来似乎不错,YGC触发的频率不高,FGC的耗时也不高,但这样的内存设置是不是有些浪费呢?

为了快速看数据,我们使用了方式2,产生了几次FullGC,FullGC之后,使用的jmap -heap 来看的当前的堆内存情况(也可以根据GC日志来看)

heap情况如下图:(命令 : jmap -heap pid)

上图中的concurrent mark-sweep generation即为老年代的内存描述。

老年代的内存占用为100M左右。 按照整个堆大小是老年代(FullGC)之后的3-4倍计算的话,设置各代的内存情况如下:

Xmx=512m Xms=512m Xmn=128m PermSize=128m 老年代的大小为 (512-128=384m)为老年代存活对象大小的3倍左右

调整之后的,heap情况

GC情况如下:

YGC 差不多在10s左右触发一次。每次YGC平均耗时大约9.41ms。可接受。

FGC平均耗时:0.016s/2=8ms

整体的GC耗时减少。但GC频率比之前的2G时的要多了一些。

注: 看上述GC的时候,发现YGC的次数突然会增多很多个,比如 从1359次到了1364次。具体原因是?

总结:

在内存相对紧张的情况下,可以按照上述的方式来进行内存的调优, 找到一个在GC频率和GC耗时上都可接受的一个内存设置,可以用较小的内存满足当前的服务需要

但当内存相对宽裕的时候,可以相对给服务多增加一点内存,可以减少GC的频率,GC的耗时相应会增加一些。 一般要求低延时的可以考虑多设置一点内存, 对延时要求不高的,可以按照上述方式设置较小内存。

补充:

永久代(方法区)并不在堆内,所以之前有看过一篇文章中描述的 整个堆大小=年轻代+年老代+永久代的描述是不正确的。

jmap -heap pid 结果参数详解

关于java设置jvm内存和java配置jvm内存的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。