关于jvmxmn的信息

本篇文章给大家谈谈jvmxmn,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

项目中的报表一运行就报内存溢出(birt报表),是哪里配置错了?

birt没用过,一直用的都是finereport,觉得挺好用的,你可以试试,类似的问题在finereport中是这样解决的:

1. 问题描述

当从数据库中查询大量的数据,每个模板取出来几百万条数据,或者是频繁的刷新项目、模板时就会占用Java虚拟机JVM的大量内存,超过内存就会出现报java.lang.OutOfMemoryError:Java heap space内存一处的错误,具体报错如下:

2. 原因

由于服务器的JVM不够用而抛出的错误,JVM在启动的时候会自动设置Heap size的值,初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。所以可以根据自己的情况进行修改JVM的-Xmn -Xms -Xmx等选项。

2.1 内存大小设置

当Heap Size设置偏小,除了报异常信息外,还会发现执行报表的速度变慢了。

Heap Size最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”

3. 解决方案

3.1 调大服务器的内存

下乱陵面我们以tomcat为例,来查看下如何修改内存大小。

修改服务器的内存溢出在TOMCAT_HOME\bin\catalina.bat 中添如下代码:

set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m

或者在开始程序 tomcat目录下面的Configure Tomat打开

选择Java设置内存大小

其他服务器的内存修改可以参考服务器内存修改文档。

3.2 启用磁盘缓存

我们默认使用的是内存缓存,就是取出的数据全部放在服务器内存中,此时若数据量大肆闭的情况下就很可能会导致内存不够用,改为磁盘缓存,就是将取出的数据部分放在内存中,部分放在磁盘中,这样可以减少服务器内存占用,但是从磁盘中读取数据会造成裂陪裂取数效率下降,增长时间的。

具体的操作可查看数据集缓存与共享的缓存至磁盘小节。

JVM的垃圾算法有哪几种

一、垃圾收集器概述

如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。

JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用

二、各个垃圾收集器说明

1、Serial(年轻代)

年轻代收集器,可以和Serial Old、CMS组合使用

采用复制算法

使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止

client模式年轻代默认算法

GC日志关键字:DefNew(Default New Generation)

图示(Serial+Serial Old)

2、ParNew(年轻代)

新生代收集器,可以和Serial Old、CMS组合使用

采用复制算法

使用多线程进行垃圾回收,回收时会导致Stop The World,其它策略和Serial一样

server模式年轻代默认算法

使用-XX:ParallelGCthreads参数来限制垃圾回收的线程数

GC日志关键字:ParNew(Parallel New Generation)

图示(ParNew + Serail Old)

3、Paralle Scavenge(年轻代)

新生代收集器,可以和Serial Old、Parallel组合使用,不能和CMS组合使用

采用复制算法

使用多线程进行垃圾回逗拿升收,回收时会导致Stop The World

关注系统吞吐量

-XX:MaxGCPauseMillis:设置大于0的毫秒数,收集器尽可能在该时间内完成垃圾回收

-XX:GCTimeRatio:大于0小于100的整数,即垃圾回收时间占总时间的比率,设置越小则希望垃圾回收所占时间越小,CPU能花更多的时间进行系统操作,提高吞吐量

-XX:UseAdaptiveSizePolicy:参数开关,启动后系统动态自适应调节各参数,如-Xmn、-XX:SurvivorRatio等参数,这是和ParNew收集器重要的区别

GC日志关键字:PSYoungGen

4、Serial Old(年老代)

年老代收集器,可以和所有的年轻代收集器组合使用(Serial收集器的年老代版本)

采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理

使用单线程进行垃圾回收敏搭,回收时会导致Stop The World,用户进程停止

GC日志关键字:Tenured

图示(Serial+Serial Old)

5、Parallel Old(年老代)

年老代收集器,只能和Parallel Scavenge组合使用(Parallel Scavenge收集器的年老代版本)

采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理

关注吞吐量的系统可以将Parallel Scavenge+Parallel Old组合使用

GC日志关键字:ParOldGen

图示(Parallel Scavenge+Parallel Old)

6、CMS(Concurrent Mark Sweep年老代)

年老代收集器,可以和Serial、ParNew组合使用

采用 ”标记-清除“算法,可以通过设置参数在垃圾回收时进行内存碎片的整理

1、UserCMSCompactAtFullCollection:默认开启,FullGC时进行内存碎片整理,整理时用户进程需停止,即发生Stop The World

2、CMSFullGCsBeforeCompaction:设置执行多少次不压缩的Full GC后,执行一个带压缩的(默认为0,表示每次进入Full GC时都进行碎片整理)

CMS是并发算法,表示垃圾回收和用户进行同时进行,但是不是所有阶段都同时进行,在初始标记、重新标记阶段还是需要Stop the World。CMS垃圾回收分这四个阶段

1、初始标记(CMS Initial mark)    Stop the World   仅仅标记一下GC Roots能直接关联到的对象,速度快

2、并发标记(CMS concurrent mark) 进行GC Roots Tracing,山老时间长,不发生用户进程停顿

3、重新标记(CMS remark)          Stop the World   修正并发标记期间因用户程序继续运行导致标记变动的那一部分对象的标记记录,停顿时间较长,但远比并发标记时间短

4、并发清除(CMS concurrent sweep) 清除的同时用户进程会导致新的垃圾,时间长,不发生用户进程停顿

适合于对响应时间要求高的系统

GC日志关键字:CMS-initial-mark、CMS-concurrent-mark-start、CMS-concurrent-mark、CMS-concurrent-preclean-start、CMS-concurrent-preclean、CMS-concurrent-sweep、CMS-concurrent-reset等等

缺点

1、对CPU资源非常敏感

2、CMS收集器无法处理浮动垃圾,即清除时用户进程同时产生的垃圾,只能等到下次GC时回收

3、因为是使用“标记-清除”算法,所以会产生大量碎片

图示

7、G1

G1收集器由于没有使用过,所以从网上找了一些教程供大家了解

并行与并发

分代收集

空间整合

可预测的停顿

[img]

Java中-XMX -xmn 是什么的缩写

这个应该是 eclipse 的配置文件 eclipse.ini 中的配置语句。在配置文件中直接传递给 java vm 的参数并不多,调用形式是这样的:

eclipse [normal arguments] -vmargs -Xmx256M [more VM args]

1. -Xmx 和 -Xms 作为主要的参数,都是放在 -vmargs 后面作为二级参数传递给 java vm 的。以 -X 开头的参数是和实现有关的,并不是适用于所有的 VMs,对于 -Xms 和 -Xmx 其含义为:

-Xms:minimum memory size for pile and heap

-Xmx:maximum memory size for pile and heap

2. 对于具体含义的猜测:

最开始只有 -Xms 的参数,表示 `初始` memory size(m表示memory,s表示size);

紧接是参数 -Xms,伏慧为了肆皮对齐三字符,压缩了其表示形式,采用计算机中约定表示方式: 用 x 表示 “大”,因此 -Xmx 中的 m 应当还是 memory。既然有了最大内存的概念,那么一开始的 -Xms 所表示的 `初始` 内存也就有了一个 `最小` 内存的概念(其实常用的做法中初始内存采用的也就是最小内存)。如果不对齐参数长度的话,其表示应当是 -Xmsx

3.另外在配置 eclipse.ini 的小常识:

JVM 最小分配内缺雹答存(初始分配内存)由-Xms指定,默认是物理内存的1/64

JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4

java xmn 设置多大合适

-Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后腔宴,将会减小年老代大小。此值对系统性能伍散银影响较大,Sun官方推荐配置为整掘皮个堆的3/8。

如何设置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

JVM内存设置多大合适?Xmx和Xmn如何设置?

问题:

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

分析:

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

具体来讲:

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

永久代 PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。

年轻代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的耗时相应会增加一些。 一般要求低延时的可以考虑多设置一点内存, 对延时要求不高的,可以按照上述方式设置较小内存。

补充:

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

转自:

-verbose:gc 现实垃圾收集信息

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

-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一

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

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

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

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

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

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

标签列表