- 浏览: 65186 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
zuo_huai:
赞一个!!!
java多线程编程 -
zuo_huai:
呵呵……,不客气
使用common-fileupload 和common-io实现文件的上传和批量上传 -
lg_asus:
呵呵,不错的东东。多谢
使用common-fileupload 和common-io实现文件的上传和批量上传
Java虚拟机(JVM)中的内存设置详解
在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步。
PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance。
GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误
Java Heap分为3个区
1.Young
2.Old
3.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?
有如下原因:
1.程序内调用了System.gc()或Runtime.gc()。
2.一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
3.Java的Heap太小,一般默认的Heap值都很小。
4.频繁实例化对象,Release对象 此时尽量保存并重用对象,例如使用StringBuffer()和String()。
如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态,许多Server端的Java程序每次GC后最好能有65%的剩余空间
经验之谈:
1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。
2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。
注意:
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
Stack的设定
每个线程都有他自己的Stack。
-Xss
每个线程的Stack大小
Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
硬件环境
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用。
4种GC
1、第一种为单线程GC,也是默认的GC,该GC适用于单CPU机器。
2、第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
3、第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
4、第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
单文件的JVM内存进行设置
默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。
设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。
java -Xms64m -Xmx256m Test
-Xms是设置内存初始化的大小
-Xmx是设置最大能够使用内存的大小(最好不要超过物理内存大小)
tomcat启动jvm内存设置
Linux:
在/usr/local/apache-tomcat-5.5.23/bin目录下的catalina.sh添加:JAVA_OPTS='-Xms512m -Xmx1024m'要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。
-Xms:初始值
-Xmx:最大值
-Xmn:最小值Windows
在catalina.bat最前面加入
set JAVA_OPTS=-Xms128m -Xmx350m 如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配200M内存就OOM了..windows服务执行的是bin/tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.解决办法:
修改注册表HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Tomcat Service Manager/Tomcat5/Parameters/JavaOptions
原值为
-Dcatalina.home="C:/ApacheGroup/Tomcat 5.0"
-Djava.endorsed.dirs="C:/ApacheGroup/Tomcat 5.0/common/endorsed"
-Xrs加入 -Xms300m -Xmx350m
重起tomcat服务,设置生效
weblogic启动jvm内存设置
在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大小进行设置,默认的设置是在commEnv.cmd里面。
JBoss
默认可以使用的内存为64MB
$JBOSSDIR$/bin/run.config
JAVA_OPTS = "-server -Xms128 -Xmx512"
Eclipse
在所在目录下,键入
eclipse.exe -vmargs -Xms256m -Xmx512m
256m表示JVM堆内存最小值
512m表示JVM堆内存最大
Websphere
进入控制台去设置:应用程序服务器 > server1 > 进程定义 > Java 虚拟机
JAVA_OPTS为:-Xms 520m -Xmx 1500m -Xss 128k
jboss性能优化:内存紧张的问题
JAVA_OPTS: -Xms 520m -Xmx 1220m -Xss 15120k +XX:AggressiveHeap
这个JAVA_OPTS犯了2个致命的错误:
1. +XX:AggressiveHeap会使得 Xms 1220m没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
另外Xmx作为允许jvm使用的最大内存数量,不应该超过物理内存的90%。
而之所以使用了这个参数,是因为不加的话,JBoss会在运行一天左右的时间后迅速崩溃,上机课是,甚至出现过半个小时就崩溃的情况。
之所以要用这个参数,用swap支持服务器运行,是因为犯了下面的错误:
2. -Xss 15120k
这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
3. -Xms指定初始化内存大小
所作的修改:
1.修改JAVA_OPTS,去掉+XX:AggressiveHeap,修改Xss。现在的JAVA_OPTS为:
-Xms 520m -Xmx 1500m -Xss 128k
2.修改deploy/jbossweb-tomcat55.sar/service.xml
将maxThreads根据目前的访问量由默认的250降为75,并使用jboss 4默认未写在标准service.xml里面而jboss 3写入了的2个参数:
maxSparseThreads=200,minSparseThreads=100
3.修改oracle-ds.xml将最大连接数有150降为50.
JVM的垃圾回收机制详解和调优
1.JVM的gc概述 为放置所有的复制全部发生以及希望对象从eden扩展到旧域,可以把MaxTenuring Threshold设置成0.设置完成后,实际上就不再使用救助空间了,因此应把SurvivorRatio设成最大值以最大化Eden空间,设置如下: |
发表评论
-
java7-(fork-join) 的使用
2016-06-29 14:17 0public class ForkJoinTest { ... -
tomcat无法启动的问题 -Xss太小
2016-06-23 16:40 2957线上的tomcat 无法启 ... -
codis实现高可用的服务端架构
2016-01-11 11:03 0codis实现高可用的服务端架构 安装codis 用lv ... -
netty入门
2014-03-14 18:14 18711 阻塞IO ,阻塞异步IO,非阻塞异步IO 首先学习n ... -
SVN权限管理
2013-09-14 10:37 01.安装subversion 2.安装TortoiseS ... -
HIVE知识点
2013-08-21 20:35 0安装hive: 1.创建目录 ... -
HQL
2013-08-21 11:07 0select site, fr, count(sid) as ... -
Hbase微博系统
2013-05-02 11:38 0HBase是一个分布式的、面向列的开源数据库 HB ... -
由Word Count 得到的HDFS、map reducde
2013-05-02 10:57 0HDFS 设计目标: 大文件 一次写入,多次读取 普 ... -
新手在Centos 6 下mysql5.5.30下源码安装
2013-03-30 09:55 13561) 下载CentOS6,mysql5.5.30 源码包, ... -
Protocol Buffers的应用与分析将数据存储在Hbase中
2013-02-04 15:24 0ddd -
hbase整合hadoop,并在Window环境下连接hbase
2012-11-26 22:33 2953环境:redhat9 ,hadoop-1.0.4,hbase- ... -
hadoop中的问题总结
2012-11-18 22:39 1700在做hadoop例子中,Win7远程连接linux服务器上的h ... -
jconsole在windows和linux版本下的使用
2013-04-02 17:10 4149在WINDWO7 平台下使用jconsole: jcons ... -
JDK自带VM分析工具jps,jstat,jmap,jconsole
2012-10-22 22:03 0一、概述 Sun 的JDK中的几个工具,非 ... -
精通java正则表达式
2012-10-16 22:41 2234精通java正则表达式 1.正则表达式的作用 ... -
java实现文件的按照每次读取固定行数读取一个 文件 ,计算文件总行数和通过LINUX 命令读取固定行数文件内容,计算文件总行数
2012-06-27 22:50 46231 ) java实现文件的按照每次读取固定行数读取一个文件 ... -
[转载]VMWARE 虚拟机连接主机,或被其他网内的机器访问
2012-04-12 12:24 2559原文:http://blog.sina.com.cn/s/bl ... -
利用Java和Java IDL创建CORBA应用
2012-01-07 22:44 2926CORBA基本介绍 CORBA ... -
enum"优雅而干净"地解决问题
2011-10-24 14:15 11531.分析代码1 和代码2 的代码 代码1: i ...
相关推荐
### Tomcat JVM内存设置方法详解 #### 一、前言 Tomcat作为一款广泛使用的Java应用服务器,其性能优化一直是开发者关注的重点之一。而在性能优化的过程中,合理设置JVM(Java Virtual Machine)内存是非常关键的一...
当内存剩余不到 40 %时,JVM 会增大堆到 Xmx 设置的值,当内存剩余超过 70 %时,JVM 会减小堆到 Xms 设置的值。 垃圾回收 GC 的角色是在 JVM 中调用垃圾回收的机制。GC 的触发机会增加 GC 的触发机会。为了避免...
JVM内存设置方法 JVM(Java Virtual Machine)是 Java 程序的运行环境,为了提高 Java 程序的性能,需要合理地设置 JVM 的内存分配。下面将详细介绍 JVM 内存设置的方法。 一、 JVM 内存设置参数 JVM 内存设置...
### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...
JVM内存设置与调优是提升应用性能的关键环节,对于大型系统尤其重要。本指南将深入探讨JVM内存模型,以及如何通过调整相关参数来优化性能。 首先,我们需要理解JVM的内存结构。JVM内存主要分为以下几个区域: 1. *...
JVM内存参数的设置对Java应用程序的性能有着至关重要的影响。以下是一些常见的JVM内存参数: 1. -Xms:设置初始堆大小。 2. -Xmx:设置最大堆大小。 3. -Xmn:设置新生代大小。 4. -Xss:设置线程栈大小。 5. -XX:...
《深入理解IDEA插件JProfiler11:高效优化JVM内存》 在Java开发领域,高效运行和优化JVM内存是至关重要的。IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能...
本文档涉及Java虚拟机(JVM)的堆内存分配和管理,以及相关的JVM内存设置参数。堆内存是Java中用于存储对象实例的区域,它在JVM内存模型中占据核心位置。在深入理解堆内存结构及其设置参数之前,我们需要明确几个...
在使用Eclipse这样的Java开发工具时,正确配置JVM内存设置是非常重要的,因为它直接影响到Eclipse的稳定性和性能。在"Eclipse中JVM内存设置"的主题下,我们需要关注几个关键的JVM参数及其作用,以及如何在eclipse....
JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要。 ### 1. JVM内存结构 #### 1.1.1 JVM内存概述 JVM内存分为几个关键区域,每个区域都有特定的...
### JVM内存配置优化 #### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组...
本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并解析给定代码片段中的关键概念。 ### JVM内存模型 在讨论如何获取JVM内存大小之前,首先需要理解JVM的内存布局。JVM内存...
### JVM内存管理详解 #### 一、JVM内存工作原理及优化设置 Java虚拟机(JVM)是Java程序运行的基础环境,在JVM中,内存管理是确保程序高效稳定运行的关键因素之一。理解JVM内存的工作原理及其优化设置,对于开发高...
在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...
标题 "ECLIPSE,TOMCAT,JVM内存设置" 涉及到的是在开发Java Web应用程序时,如何配置Eclipse集成开发环境(IDE)、Apache Tomcat服务器以及Java虚拟机(JVM)的内存参数,以优化性能和避免内存溢出等问题。...
在部署Java Web应用时,Tomcat作为常见的容器之一,其JVM内存设置同样至关重要。以下是在Tomcat环境中优化JVM内存的具体步骤: 1. **环境变量设置**:通过设置`CATALINA_OPTS`环境变量,可以在系统级别全局地调整...
该文档描述了开发测试环境中Docker及JVM内存限制部署方案
### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...