Apr 30
1.JVM的gc概述
  
    gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。
  
    在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能。有些垃圾收集专用于特殊的应用程序。比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率。理解了应用程序的工作负荷和jvm支持的垃圾收集算法,便可以进行优化配置垃圾收集器。
  
    垃圾收集的目的在于清除不再使用的对象。gc通过确定对象是否被活动对象引用来确定是否收集该对象。gc首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。
  
    1.1.引用计数
    引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm必须适当增减引用数。当某对象的引用数为0时,便可以进行垃圾收集。
  
    1.2.对象引用遍历
    早期的jvm使用引用计数,现在大多数jvm采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
  
    下一步,gc要删除不可到达的对象。删除时,有些gc只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多gc可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。
Apr 30
Mac OS X的Java虚拟机除了具有标准的HotSpot虚拟机的选项之外,还支持很多非标准的选项(-X和-XX),本章列出了这些选项以及一些值得注意的例外事项。

请注意: 除非特别声明,否则在一个选项中指定的bytes(字节)都是作为参数。您也可以分别通过k或者m这两个字母来指定千个字节或者兆个字节(大小写都可以)。例如,下面的几种形式都是表示字节数:4194301,4096k,4096K,4m,和4M。



一般选项

-server
在Mac OS X中没有特别的服务器虚拟机(server VM)。在激活java的时候可以使用 -server 选项,但这并不是启动另外的虚拟机,它还是启动客户虚拟机(client VM),只是这个虚拟机针对服务器的使用环境进行了调优。这些调优包括:
在共享档案的生成过程中使用不同的类列表,这个列表中不包括GUI类(见“Mac OS X的Java共享档案”部分)。

增加Java堆的尺寸。

增加Eden代的内存空间的尺寸。

打开线程的本地Eden垃圾收集器(garbage collection)。

Apr 30
  PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m 2、在tomcat中redeploy时出现outofmemory的错误. 可以有以下几个方面的原因:
1,使用了proxool,因为proxool内部包含了一个老版本的cglib.
2, log4j,最好不用,只用common-logging
3, 老版本的cglib,快点更新到最新版。
4,更新到最新的hibernate3.2 3、

这里以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。
一、java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
二、java.lang.OutOfMemoryError: Java heap space Heap size 设置 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:手动设置Heap size 修改TOMCAT_HOME/bin/catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
三、实例,以下给出1G内存环境下java jvm 的参数设置参考: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

Apr 22
Borland Optimizeit Suite 是Borland 提供的一个Java 代码优化工具包,包括:
1、Profiler:内存、Java 虚拟机、CPU 使用情况跟踪
2、Thread Debugger:Thread 跟踪工具
3、Code Coverage:代码运行覆盖跟踪工具,可以提供代码的覆盖率

以下是详细的介绍:

【1、Profiler:】
首先介绍一下什么是JAVA的内存泄漏
Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。
随着越来越多的服务器程序采用Java技术,例如JSP,Servlet, EJB等,服务器程序往往长期运行。另外,在很多嵌入式系统中,内存的总量非常有限。内存泄露问题也就变得十分关键,即使每次运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。
Java存在内存泄露问题,其原因主要是一些对象虽然不再被使用,但它们仍然被引用。为了解决这些问题,我们可以通过软件工具来检查内存泄露,检查的主要原理就是暴露出所有堆中的对象,让程序员寻找那些无用但仍被引用的对象。

Profiler 主要用于观察当前的内存及Java 虚拟机、CPU 使用情况。
  可以查看的内容:
       在图标栏中间的3个按钮从左到右依次代表查看Java 虚拟机、CPU、内存情况。
  查看内存情况可以按照以下几种方式查看:
       1、Heap:堆,缺省模式
       2、Allocation Backtrace:显示Heap 中某一Class 的被调用情况
       3、Instance Display:显示某一实例的引用(Reference)情况
       4、Reference from roots:以类继承关系显示各个类占用内存的情况
后两种模式下可以通过双击Allocated at 列表来查看源代码,当然源代码路径必须事先设定。


【2、Thread Debugger】
Thread Debugger 用于线程的调试,可以观察线程的运行、死锁及线程调用方法。
Thread Debugger 可以使用的功能:
       1、查看线程情况
       2、查看Monitor 信息:主要是看线程的Block。
       3、启动Moniter 分析
查看线程情况可以按照
       1、Acitvate 模式:查看线程的活动情况
       2、Contention 模式:显示Contention,所谓Contention 指两个或两个以上的Thread 试图同时进入同一个Monitor
       3、Waiting 和I/O Waiting 模式
       4、Moniter Enter 模式:显示线程进入Moniter 及在Moniter 运行的情况。

【3、Code Coverage:】
主要功能:用来检测哪些代码执行了,哪些代码没有执行,执行过的代码占总代码的比例。
使用步骤:
1、设置(FILE->SETTINGS)要执行的类,要包含的包,源代码路径。
2、开始执行
3、Class Coverage(类代码覆盖率)视图可以看到系统引用的所有类的代码的覆盖率。
4、双击Class Coverage中一个类可以跳转到这个类的方法覆盖率视图(Method Coverage)

图标栏右上角的三个按钮分别是
1、Class Coverage(类代码覆盖率)视图
2、方法覆盖率视图(Method Coverage)
3、控制台视图,可以看到程序的输出结果。注意:不支持中文显示。

Apr 21
1.程序员其实可痛苦的了......需求一做一改,一个月就过去了;嚎~需求再一改一调,一季度就过去了;嚎~
2..程序员最痛苦的事儿是啥,知道不?就是,程序没做完,需求又改了;
3..程序员最最痛苦的事儿是啥,知道不? 就是,系统好不容易做完了,方案全改了;
4..程序员最最最痛苦的事儿是啥,知道不? 就是,系统做完了,狗日的客户跑了;
5..程序员最最最最最痛苦的事儿是啥,知道不? 就是,狗日的客户又回来了,程序给删没了
分页: 61/73 第一页 上页 56 57 58 59 60 61 62 63 64 65 下页 最后页 [ 显示模式: 摘要 | 列表 ]