`
crazycode
  • 浏览: 153593 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

bea jrockit的确是个生产应用的好平台

    博客分类:
  • Java
阅读更多
公司有一台linux pc server,配置AMD2800+,内存1G,安装了tomcat5.5+sun jdk6.0,上面跑了10个左右Web应用,例如一些开发管理系统、项目演示等,tomcat已经设置了-Xms256M -Xmx768M -XX:PermSize=64M -XX:MaxPermSize=256M这些虚拟机参数。另外服务器上还有subversion、apache、openldap等服务,但一般过一段时间会tomcat死一下,所以设置了一个每天晚上自动重新启动一下。
近来因为项目紧张,服务器用的人多了,出现内存不足,top显示使用了约500M的swap空间,频繁出现java out of memory,tomcat经常死机,严重影响工作。而且还出现晚上不能重新启动的问题,早上过来服务器不可用,影响一天心情。

上周向公司申请了采购了几根1G的内存,这台服务器只分到一根1G条,且只有两根内存插槽,将就一下,升级到1.5G内存,同时了解到Bea JRockit已经解决了PermSize的问题,决定使用jrockit vm试试,结果出乎我意料的好。

我下载的是jrockit sdk 6.0,在linux上设置JAVA_HOME指向安装目录,并把$JAVA_HOME/bin加到PATH变量,修改catalina.sh,在前面加入:
JAVA_OPTS="-server -Xms256M -Xmx576M"

jrockit已经不需要-XX:PermSize这样的参数了。
使用一个星期以来,Tomcat从来没有死过,内存使用一直稳定在565M左右,系统总内存稳定在1480M左右,相当的稳定,而且java应用的速度感觉有很大的提高。

总体来说,我全力推荐在生产应用服务器上使用jrockit vm,它会给你带来意想不到的惊喜。但本地开发我还是选择使用sun java sdk,在我的开发机上,jrockit吃内存相对厉害,而我只有1G的内存。

注:所谓PermSize,是指vm为类描述信息分配的内存空间,随着动态类等技术的广泛应用,这一内存区默认的64M大小已经不能满足需要,而且,sun vm对这部分内存居然无法进行gc,所以需要设置一个比较大的PermSize。但长时间运行后特别是频繁进行JavaEE应用部署的话,仍然会出现out of memory异常。
分享到:
评论
6 楼 crazycode 2007-12-18  
答复tangyuanjian:
无须特殊的设置,可以共存。共存也不需要jdk版本一致,但jdk6编译的.class是不能在jrockit5上运行的,只能在jrockit6上运行。

我一般是设置JAVA_HOME,并把JAVA_HOME/bin设置到PATH的第一位,这样切换jdk时,只需要修改JAVA_HOME的值就可以了。
5 楼 crazycode 2007-12-18  
回复Qieqie:
qieqie是“庖丁解牛”框架的作者吧,久仰。

查了一下资料,我记错了数据,默认PermSize是64M。
这个问题我之前也想过,Permanent Generation保存了JVM中所有对象的类信息,包括类的元数据,还有方法描述等等,毕竟sun设置默认PermSize也是认为这堆空间会达到一个上限后不再上升,但是,在Java大程序的情况下,尤其是Java EE的大型应用程序上,Permanent Generation的大小会直接限定能载入类的数量和大小。现代java应用程序使用的jar包动辄几十M,部署近10个web应用,内置的不同版本的jar包,加上jsp生成的类、各类框架生成的动态类(Hibernate、Spring大量使用这类技术,动态代理是现代框架的一个重要特点),类的数量十分可观。我觉得内存一直上升的原因是java是延迟加载的,在使用过程中加载出不同的模块(jar),因为应用比较多而出现Perm不足,这时设置更大的PermSize也许会解决问题。
而且,据我的经验,使用sun vm,多次重新生成并部署war模块,达到一定次数后,不管是tomcat还是weblogic,应用服务器都会出现Out of memory,屡试不爽。这也是重新部署后类的描述信息更新了,旧的类描述不能释放造成的。
4 楼 tangyuanjian 2007-12-17  
如何设置,让jdk和jrockit共存,jdk和jrockit的版本要完全一致吗,比如是1.5.6,两者都要一样吗!
3 楼 Qieqie 2007-12-17  
我撇开你使用jrockit带来的好处,纯粹和你讨论为什么你在Sun jdk下跑这么喘

首先丢给你个问题:动态类(proxy,cglib...)只能一次性的吗?是不可再重复利用的吗?如果是可重复利用的,那这些数据还是有一个极限的,不需要操心去GC它们。
(我自己动手实践的结果是: Proxy.newProxyInstance(...)只要是代理同样的接口则proxy类(名)是一样的,见后代码)

虽然,有可能一些不良程序可能会不断建立不同的动态类给同一个接口或类。但是仅从你提供的帖子的信息看,我认为你的问题不是动态类带来的,除非有其他证明(数据说明)。

假如这个前提成立的话,那就继续以下的分析:

你的perm空间占用实际值却是不断增大(以致你要调到256m),说明你older空间不断“升级”对象给perm,如果older持续上来对象,perm space将吃不消。到一定程度时,perm space用差不多了,older对象又想上来就上不来了,此时new genneration等不到older腾出空间,这就出现植物人现象 或out of memory之类的现象了。

所以问题的实质是:到底是些什么导致older对象这么多,不断往上跑,而使jdk gc无法gc到它们?


package net.paoding.proxytest;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Main {
	
	interface A {
		public String hello();
	}
	
	interface B {
		public String hello();
	}

	public static void main(String[] args) {
		for (int i = 0; i < 3; i++) {
			A p = getA();
			System.out.println(p.getClass().getName());
			System.out.println(p.hello());
			System.out.println("-------------");
		}
		for (int i = 0; i < 3; i++) {
			B p = getB();
			System.out.println(p.getClass().getName());
			System.out.println(p.hello());
			System.out.println("-------------");
		}
	}

	private static A getA() {
		A p = (A) Proxy.newProxyInstance(Main.class.getClassLoader(),
				new Class[] { A.class }, new InvocationHandler() {
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {
						return "hello A";
					}
				});
		return p;
	}


	private static B getB() {
		B p = (B) Proxy.newProxyInstance(Main.class.getClassLoader(),
				new Class[] { B.class }, new InvocationHandler() {
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {
						return "hello B";
					}
				});
		return p;
	}
}


net.paoding.proxytest.$Proxy0
hello A
-------------
net.paoding.proxytest.$Proxy0
hello A
-------------
net.paoding.proxytest.$Proxy0
hello A
-------------
net.paoding.proxytest.$Proxy1
hello B
-------------
net.paoding.proxytest.$Proxy1
hello B
-------------
net.paoding.proxytest.$Proxy1
hello B
-------------
2 楼 crazycode 2007-12-17  
没有,不需要,java编译出来的.class是二进制兼容的。
1 楼 tangyuanjian 2007-12-17  
bea 真的有这么好吗?我想问一下,你的java文件需要用bea jrockit重新编译一下吗?

相关推荐

    Bea JRockit j2sdk 1.4.2_05 win32

    总之,Bea JRockit j2sdk 1.4.2_05 win32是一个专为性能而生的Java运行时环境,尤其适合处理大型、复杂的企业级应用,其优秀的内存管理和垃圾回收机制为开发者提供了可靠的保障。虽然现在已被Oracle的Java SE所取代...

    JRockit Mission Control介绍及配置

    JRockit Mission Control 是 BEA(现已被 Oracle 收购)推出的一款强大的 Java 应用性能管理和诊断工具,特别适用于检测和解决内存泄漏问题。这个工具集在 JRockit R26.0.0 及后续版本中捆绑提供,最新版本为 2.0.1...

    Oracle JRockit

    选择JVM应根据具体的应用需求,比如对性能敏感的系统可能更适合JRockit,而对开源生态支持和跨平台兼容性有要求的项目可能倾向于使用OpenJDK。开发者需要考虑性能、稳定性、许可证、社区支持等多个因素来决定最适合...

    Oracle JRockit_The Definitive Guide

    - **定义**:JRockit是由BEA Systems(后被Oracle收购)开发的一款高性能Java虚拟机(JVM),专门针对服务器端的应用进行了优化。 - **特点**:JRockit在设计之初就着眼于服务器环境下的性能和稳定性,具备出色的内存...

    jrockit 手册

    例如,对于需要低暂停时间的应用,CMS是一个好选择,而G1则在大内存应用中表现优秀。 2. **JRockit Mission Control (JMC)**:这是一款强大的工具,可以帮助开发者监控和分析JVM的性能。通过JMC,我们可以实时查看...

    JRockit安装文档

    JRockit是BEA Systems公司(现已被Oracle收购)开发的一款专为大型企业级应用设计的Java虚拟机(JVM)。它以其卓越的性能、稳定的运行环境以及强大的管理工具在业界享有盛誉。对于那些对性能有极高要求的应用场景来...

    jrockit jdk 1.6.0-45

    **Java Development Kit (JDK) 1.6.0-45** JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的核心...这个版本为开发者提供了高效且稳定的Java开发平台,特别适合对性能有高要求的应用场景。

    JRockit权威指南1

    书中详细介绍了JRockit Mission Control,这是一个强大的工具集,允许开发者远程访问JRockit JVM,进行性能分析、内存诊断和故障排查。Mission Control的前身是内部开发工具,随着时间的发展,它已经成为JRockit开发...

    JDK9-JSE-JRockit to HotSpot Migration Guide-29.pdf

    Oracle 公司收购 BEA Systems 后,将 JRockit 整合到 Java 平台标准版中。然而,Oracle 公司后来推出了 HotSpot,旨在取代 JRockit。HotSpot 是一款高性能、低延迟的 Java 虚拟机,提供了更好的性能和可扩展性。 ...

    JDK12-jrockit-hotspot-migration-guide.pdf

    * 性能优化:HotSpot 的性能优化机制不同于 JRockit,需要了解如何优化应用程序以获得更好的性能。 * Compatibility:需要确保应用程序在 HotSpot 环境中能正常工作,包括兼容性问题和依赖项问题。 三、迁移指南 ...

    jrockit调优指南

    jRockit是一款高性能的Java虚拟机,由BEA Systems开发,后被Oracle公司收购。jRockit具有优秀的自动化优化能力,但为了进一步提升性能,了解并掌握其调优策略至关重要。 一、jRockit垃圾收集器选择 jRockit支持四...

    jrockit-jdk1.6.0_45-R28.2.7-4.1.0源码

    2. **即时编译(JIT)技术**:JRockit的JIT编译器被称为"BEA JRockit Mission Control",它具有更先进的静态和动态分析能力,能更有效地优化代码,提高运行速度。 3. **并发和多线程优化**:JRockit在并发处理上...

    JavaAPsvr_A_200608_WLS9.pdf

    通过对WebLogic Server 9.x进行有效的内存监控和管理,特别是通过BEA JRockit及其内置的Memory Leak Detector工具,可以显著提高应用服务器的稳定性和性能。这不仅有助于及时发现并解决内存泄漏问题,还可以确保应用...

    JDK11-jrockit-hotspot-migration-guide.pdf

    JRockit 虚拟机是 Oracle 收购 BEA Systems 后获得的技术,具有高性能和低延迟的特点。HotSpot 虚拟机是 Oracle 公司自主开发的虚拟机,具有高性能、低延迟和高可扩展性的特点。 迁移步骤 1. 评估当前环境:评估...

    Oracle收购BEA后的中间件以及SOA产品线战略分析

    首先,Oracle应用服务器的战略调整体现在WebLogic、Tuxedo和JRockit的融合。WebLogic,作为BEA的旗舰级J2EE服务器,将取代Oracle原有的J2EE容器,成为Oracle的新基础设施。预计下一个版本的WebLogic可能会命名为...

    WebLogic Real Time简介

    总的来说,WebLogic Real Time结合了BEA JRockit JVM的优势,为开发者提供了一个能够在Java平台上实现高效率、低延迟和高确定性的实时应用开发环境。通过对实时计算基础知识的理解和WLRT的运用,企业能够构建出更...

Global site tag (gtag.js) - Google Analytics