- 浏览: 441493 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (77)
- SERVLET (1)
- APP SERVER (3)
- MAVEN (2)
- IDE (0)
- JS (10)
- OTHER (4)
- CSS (1)
- DB (5)
- HIBERNATE (7)
- SPRING (4)
- ECLIPSE (5)
- STRUTS (1)
- ANNOTATION (3)
- SEARCH (11)
- HTML (2)
- HTTP (1)
- SYSTEM (3)
- JVM (12)
- JAVA (6)
- 算法 (0)
- TEST (1)
- 常用问题 (1)
- android (2)
- hadoop (1)
- NOSQL (1)
- 好文章 (0)
- LINUX (0)
- 临时 (0)
- Hbase (0)
- JS正则 (1)
最新评论
-
king_qing:
xinzhi_3600 写道u013275927 写道大哥,你 ...
注解@PostConstruct与@PreDestroy -
superLinux:
可以了,按照3楼的修改下就可以了
Eclipse is running in a JRE, but a JDK is required 解决方法 -
whg333:
zy315351965 写道请你验证以后再发出来,不要浪费宝贵 ...
Eclipse is running in a JRE, but a JDK is required 解决方法 -
zy315351965:
请你验证以后再发出来,不要浪费宝贵的时间
Eclipse is running in a JRE, but a JDK is required 解决方法 -
xinzhi_3600:
u013275927 写道大哥,你这错误挂了三年,得影响多少人 ...
注解@PostConstruct与@PreDestroy
一 .JVM 内存 的设置的原理
默认的
java
虚拟机的大小比较小,在对大数据进行处理时
java
就会报错:
java.lang.OutOfMemoryError
。设置
jvm
内存
的方法,对于单独的
.class
,可以用下面的方法对
Test
运行时的
jvm
内存
进行设置。
java -Xms64m -Xmx256m Test
-Xms
是设置内存
初始化的大小
-Xmx
是设置最大能够使用内存
的大小(最好不要超过物理内存
大小)
在
weblogic
中,可以在
startweblogic.cmd
中对每个
domain
虚拟内存
的大小进行设置,默认的设置是在
commEnv.cmd
里面。
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
下面是这几个设置的一些背景知识:
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存 均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM 中堆之外的内存 称为非堆内存 (Non-heap memory)”。可以看出JVM 主要管理两种类型的内存 :堆和非堆。简单来说堆就是Java代码可及的内存 ,是留给开发人员使用的;非堆就是JVM 留给 自己用的,所以方法区、JVM 内部处理或优化所需的内存 (如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存 中。
JVM 初始分配的内存 由-Xms指定,默认是物理内存 的1/64;JVM 最 大分配的内存 由-Xmx指定,默认是物理内存 的1/4。默认空余堆内存 小于40%时,JVM 就会增大堆直到-Xmx的最大限制;空余堆内存 大于70%时, JVM 会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
JVM 使用-XX:PermSize设置非堆内存 初始值,默认是物理内存 的1/64;由XX:MaxPermSize设置最大非堆内存 的大小,默认是物理内存 的1/4。
首先JVM 内存 首先受限于实际的最大物理内存 ,假设物理内存 无限 大的话,JVM 内存 的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存 空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是 2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了
JVM 内存 的调优
1. Heap 设定与垃圾回收 Java Heap 分为 3 个区, Young , Old 和 Permanent 。 Young 保存刚实例化的对象。当该区被填满时, GC 会将对象移到 Old 区。 Permanent 区则负责保存反射对象,本文不讨论该区。 JVM 的 Heap 分配可以使用 -X 参数设定,
-Xms |
初始 Heap 大小 |
-Xmx |
java heap 最大值 |
-Xmn |
young generation 的 heap 大小 |
JVM 有 2 个 GC 线程。第一个线程负责回收 Heap 的 Young 区。第二个线程在 Heap 不足时,遍历 Heap ,将 Young 区升级为 Older 区。 Older 区的大小等于 -Xmx 减去 -Xmn ,不能将 -Xms 的值设的过大,因为第二个线程被迫运行会降低 JVM 的性能。
为什么一些程序频繁发生 GC ?有如下原因:
l 程序内调用了 System.gc() 或 Runtime.gc() 。
l 一些中间件软件调用自己的 GC 方法,此时需要设置参数禁止这些 GC 。
l Java 的 Heap 太小,一般默认的 Heap 值都很小。
l 频繁实例化对象, Release 对象。此时尽量保存并重用对象,例如使用 StringBuffer() 和 String() 。
如果你发现每次 GC 后, Heap 的剩余空间会是总空间的 50% ,这表示你的 Heap 处于健康状态。许多 Server 端的 Java 程序每次 GC 后最好能有 65% 的剩余空间。经验之谈:
1 . Server 端 JVM 最好将 -Xms 和 -Xmx 设为相同值。为了优化 GC ,最好让 -Xmn 值约等于 -Xmx 的 1/3[2] 。
2 .一个 GUI 程序最好是每 10 到 20 秒间运行一次 GC ,每次在半秒之内完成 [2] 。
注意:
1 .增加 Heap 的大小虽然会降低 GC 的频率,但也增加了每次 GC 的时间。并且 GC 运行时,所有的用户线程将暂停,也就是 GC 期间, Java 应用程序不做任何工作。
2 . Heap 大小并不决定进程的内存 使用量。进程的内存 使用量要大于 -Xmx 定义的值,因为 Java 为其他任务分配内存 ,例如每个线程的 Stack 等。
2 . Stack 的设定
每个线程都有他自己的 Stack 。
-Xss |
每个线程的 Stack 大小 |
Stack 的大小限制着线程的数量。如果 Stack 过大就好导致内存 溢漏。 -Xss 参数决定 Stack 大小,例如 -Xss1024K 。如果 Stack 太小,也会导致 Stack 溢漏。
3 .硬件环境
硬件环境也影响 GC 的效率,例如机器的种类,内存 , swap 空间,和 CPU 的数量。
如果你的程序需要频繁创建很多 transient 对象,会导致 JVM 频繁 GC 。这种情况你可以增加机器的内存 ,来减少 Swap 空间的使用 [2] 。
4 . 4 种 GC
第一种为单线程 GC ,也是默认的 GC 。,该 GC 适用于单 CPU 机器。
第二种为 Throughput GC ,是多线程的 GC ,适用于多 CPU ,使用大量线程的程序。第二种 GC 与第一种 GC 相似,不同在于 GC 在收集 Young 区是多线程的,但在 Old 区和第一种一样,仍然采用单线程。 -XX:+UseParallelGC 参数启动该 GC 。
第三种为 Concurrent Low Pause GC ,类似于第一种,适用于多 CPU ,并要求缩短因 GC 造成程序停滞的时间。这种 GC 可以在 Old 区的回收同时,运行应用程序。 -XX:+UseConcMarkSweepGC 参数启动该 GC 。
第四种为 Incremental Low Pause GC ,适用于要求缩短因 GC 造成程序停滞的时间。这种 GC 可以在 Young 区回收的同时,回收一部分 Old 区对象。 -Xincgc 参数启动该 GC 。
4 种 GC 的具体描述参见 [3] 。
参考文章:
1. JVM Tuning. http://www.caucho.com/resin-3.0/performance/jvm -tuning.xtp#garbage-collection
2. Performance tuning Java: Tuning steps
http://h21007.www2.hp.com/dspp/tech/tech_TechDocumentDetailPage_IDX/1,1701,1604,00.html
3. Tuning Garbage Collection with the 1.4.2 JavaTM Virtual Machine .
http://java.sun.com/docs/hotspot/gc1.4.2/
二. Tomcat 配置
问题分析:
由于 TOMCAT 内存 溢出而引发的问题,主要原因是 JVM 的虚拟内存 默认为 128M ,当超过这个值时就把先前占用的内存 释放,而导致好象 TCP/IP 丢包的假象,出现 HTTP500 的错误。解决方法主要是加大 TOMCAT 可利用内存 ,并在程序当中加大内存 使用。
解决方法:
方法:加大 TOMCAT 可利用内存 :
在 TOMCAT 的目录下,也就是在 TOMCAT41/bin/catalina.bat 文件最前面加入
set JAVA_OPTS=-Xms800m -Xmx800m
表现效果是当你启动 TOMCAT 时,系统内存 会增加近 800M 使用
操作方法:
1 )、先关掉 WINDOWS 服务当中的 TOMCAT4 服务。
2 )、再找到 TOMCAT/BIN 目录下 startup.bat ,双击打开它,你会发现现 WINDOWS 内存 占用会增加近 800M 。
3 )、执行程序,因为是 TOMCAT 重新编译程序,所以第一次会比较慢。
结论:
经过测试,我们得出如下数据:
当系统传输约 2000 条数据时,大约近 12M 的净数据(不压缩时),系统辅助运行的内存 大约占用 150M 左右的空间,也就是近 200M 的内存 占用,而我们扩大了近 800M 的 JAVA 内存 使用,这对于业务本身来说是足够了。所以你们不用担心大数据量的传递问题。
基于 JAVA 虚拟机的原理, JAVA 自动有垃圾回收机制,也就是在你对一些内存 长时间不使用时(近 2 分钟,取决于使用频度和优先级等),就会自动垃圾回收,从而释放不用的内存 占用。
三 .WebLogic 配置:
由于 WebLogic 的配置问题,我们的测试出现了失败情况。原因是为 WebLogic 分配的内存 太少了。通过修改 commom/bin/commEnv.cmd 文件来增加内存 分配。
修改的部分如下:
:bea
if "%PRODUCTION_MODE%" == "true" goto bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms768m -Xmx1024m
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto continue
:bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms768m -Xmx1024m// 原来是 128M ~256M ,太小了,数据太大
goto continue
结果修改后,没有效果。还是有失败的情况。
发现,原来,在: bea 下面还有一段配置信息如下:
:sun
if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode
set JAVA_VM=-client
set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto continue
:sun_prod_mode
set JAVA_VM=-server
set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m
goto continue
将这里的内存 分配修改后见效。
原因是,上面对第一段代码是为 bea 自己的 JVM 设置的,下面的是为 Sun 的设置的。而 WebLogic 默认的是 Sun 的,所以出了毛病。在 JDK 的选择上, weblogic 有两种 JDK 供选择,一种是 Sun 的 JDK ,另外一种是 Bea 的 jrockit 。按照 bea 的网站的说明, sun jdk 提供更好的兼容性,而使用 jrockit 可以提供更好的性能。作为 weblogic 集群我全部采用 jrockit 作为 JDK 环境,以达到更高的性能。
在默认启动情况下, jrockit 启动时为其窗口配置的内存 大小比较小。注意 weblogic 的启动内存 配置 -Xms32m -Xmx256m ,通过修改 commEnv.sh 可以修改这个参数, Xms 表示启动开始分配的内存 , Xmx 表示最大能分配的内存 ,这里我们根据应用情况调整为 -Xms1536m -Xmx1536m ,这点需要根据自身测试情况和系统配置进行调整,经过周一晚的调试,我们目前应用比较合理的窗口内存 大小为 1536M ( 2G × 75 %),通过 top 可以观察到测试中的内存 反应,最合理的应该是恰好把物理内存 用完。
发表评论
-
学习Solr不错的系列文章
2013-03-23 21:24 0学习Solr不错的系列文章 1)Solr 3.5 配置及应 ... -
JVM调优总结 -Xms -Xmx -Xmn -Xss
2012-03-25 19:15 1115堆大小设置 JVM 中最大堆大小有三方面 ... -
java性能调优工具介绍-Jstatd
2012-03-24 19:01 7925收藏了 jstatd是一个rmi的server应用,用 ... -
JVM内存管理:深入垃圾收集器与内存分配策略
2012-02-21 15:49 1127Java与C++之间有一堵由 ... -
NekoHTML学习笔记
2011-12-06 14:46 4014NekoHTML 学习笔记 ... -
最短编辑距离算法
2011-11-30 14:54 0最短编辑距离算法,在搜索引擎开发中应用很多,比如相关词等 还 ... -
URLClassLoader
2011-11-07 19:01 0转载自梦想Java [ http:/ ... -
JDK工具之一(JPS)
2011-11-07 17:53 0至于在XP系统下JPS显示无效的问题暂时还没有找到解决方案,网 ... -
JDK工具之一(JPS)
2011-11-07 17:49 1至于在XP系统下JPS显示无效的问题暂时还没有找到解决方案,网 ... -
Java 6 JVM参数选项大全(中文版)
2011-10-24 10:45 1299Java 6 JVM 参数选项大全(中文版) ... -
MyEclipse 7.5 设置
2011-10-20 11:00 0这几天启动MyEclipse7.5 ... -
Dynamic Code Evolution for Java dcevm 原理
2011-10-20 10:46 0在hostswap dcevm 中我们对Dynamic ... -
hostswap dcevm
2011-10-20 10:40 0什么是dcevm dcevm(DynamicC ... -
classLoader卸载与jvm热部署
2011-10-20 10:38 0以下的相关介绍都是在未使用dcevm的情况 classLoa ... -
HotSpot VM GC 的种类
2011-10-21 09:40 990collector种类 GC在 HotSpot ... -
JVM系列五:JVM监测&工具
2011-10-21 09:40 1165前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环 ... -
JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
2011-10-21 09:40 1142java application项目(非web项目) 改进前 ... -
JVM系列三:JVM参数设置、分析
2011-10-20 10:34 0<p>不管是YGC还是Full GC,GC过程中都 ... -
JVM系列二:GC策略&内存申请、对象衰老
2011-10-20 10:32 1090JVM里的GC(Garbage Collection) ... -
JVM系列一:JVM内存组成及分配
2011-10-20 10:30 975java内存组成介绍:堆(Heap)和非堆(Non-hea ...
相关推荐
jvm内存调优是高级工程师以上岗位的面试中经常会被问到的问题,有一定深度和难度的问题,学习java,如果不知道jvm内存调优,说明肯定是个小菜鸟,小编总结了一些知识点供大家学习与分享
**JVM内存调优深入解析** Java虚拟机(JVM)内存调优是优化Java应用程序性能的关键环节。本文将从JVM内存结构、垃圾回收算法以及具体的垃圾收集器等方面进行详细探讨,帮助读者理解JVM如何管理和清理内存,以及如何...
了解这些内存区域后,我们来谈谈JVM内存调优。调优主要包括以下几个方面: 1. 设置合理的堆大小:过大可能导致内存浪费,过小则可能导致频繁的垃圾收集。可以通过-Xms和-Xmx设置初始堆大小和最大堆大小。 2. 年轻...
在深入探讨JVM内存调优之前,我们需要理解JVM内存模型的基础知识。 JVM内存主要分为以下几个区域: 1. **程序计数器(Program Counter Register)**:每个线程都有一个独立的程序计数器,用于记录当前线程所执行的...
"JVM内存调优" JVM(Java Virtual Machine)是 Java runtime 环境的核心组件,负责将 Java 字节码转换为机器代码,并管理 Java 程序的执行。JVM 的内存模型主要包括方法区、栈、堆和程序计数器四部分。 方法区...
《深入理解Java虚拟机》是一本深度探讨Java虚拟机(JVM)的著作,涵盖了JVM性能调优、内存模型以及虚拟机原理等多个关键领域。本文将基于这些主题,详细阐述其中的重要知识点。 首先,我们要了解Java虚拟机(JVM)...
首先,需要注意的是,在对 JVM 内存调优的时候不能只看操作系统级别 Java 进程所占用的内存,因为 GC 过后这个值是不会变化的。因此,在内存调优的时候要更多地使用 JDK 提供的内存查看工具,比如 JConsole 和 Java...
jvm性能调优+内存模型+虚拟机 jvm性能调优+内存模型+虚拟机 jvm性能调优+内存模型+虚拟机
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
在Java编程语言中,方法参数的传递方式是一个重要知识点。Java方法参数的传递分为值传递和引用传递...这些知识点对于准备Java面试的开发者来说,是必须掌握的重要内容,同时也是深入理解JVM内存管理和性能优化的基础。
JVM性能调优总结 JVM性能调优是Java开发中非常重要的一方面,直接影响到系统的性能和稳定性。本文将总结JVM性能调优的经验和技巧,并提供一些实用的配置参数和建议。 一、堆大小设置 堆大小是JVM性能调优中的一个...
- **案例二:大数据处理平台调优**:大数据处理平台往往需要处理海量数据,通过对JVM内存配置、垃圾回收机制等方面的优化,提升数据处理速度。 - **案例三:分布式系统调优**:分布式系统面临着网络延迟、节点通信等...
### 三、JVM内存调优 1. **堆大小设置**:通过`-Xms`和`-Xmx`设置初始和最大堆大小,避免频繁调整大小导致的性能波动。 2. **新生代和老年代比例**:通过`-XX:NewRatio`控制新生代和老年代的比例,优化对象晋升策略...
《JVM性能调优-JVM内存整理及GC回收》是一份深入探讨Java虚拟机(JVM)优化的重要学习资料,特别适合对JAVA编程有经验的开发者。这份文档详细阐述了JVM性能调优的关键概念,包括JVM内存模型、垃圾回收(Garbage ...
本文将深入探讨JVM内存结构、监控工具及其在调优和GC优化中的应用。 **JVM内存机构** JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是JVM中最大的一块内存区域,主要用于存储对象实例。堆被进一步...
* JVM内存模型:JDK 1.8中,元数据区取代了永久代,元空间是使用本地内存的。JVM内存模型包括程序计数器、Java虚拟机栈、本地方法栈、Java堆等区域。 JVM参数调优 * JVM参数查看:可以使用java -XX:+...
【标题】: "第04章 大促高并发系统下JVM如何调优指导03.pdf" 在大型促销活动期间,高并发系统的性能优化至关重要,尤其是Java虚拟机(JVM)的调优,它直接影响应用程序的响应速度和稳定性。本章节主要探讨了在亿级...
《JVM性能调优——JVM内存整理及GC回收》是针对Java开发人员的重要主题,尤其是在大型企业级应用中,确保JVM(Java虚拟机)的高效运行是至关重要的。本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来...
本文将探讨架构师在面对高并发系统时应该如何进行JVM调优,以及对Java技术体系和JVM内存管理进行深入了解。 首先,架构师在面对系统架构设计时,除了考虑系统的宏观架构外,还需深入到程序底层,考虑JVM的优化。高...