使用Memory Analyzer tool(MAT)分析内存泄漏(二)

使用Memory Analyzer tool(MAT)分析内存泄漏(二)
使用Memory Analyzer tool(MAT)分析内存泄漏(二)

使用Memory Analyzer tool(MAT)分析内存泄漏(二)

前言的前言

写blog就是好,在大前提下可以想说什么写什么,不像投稿那么字字斟酌。上周末回了趟成都办事,所以本文来迟了。K117从达州经由达成线往成都方向走的时候,发现铁路边有条河,尽管我现在也不知道其名字,但已被其深深的陶醉。河很宽且水流平缓,河边山丘森林密布,民房星星点点的分布在河边,河里偶尔些小船。当时我就在想,在这里生活是多么的惬意,夏天还可以下去畅游一番,闲来无事也可垂钓。唉,越来越讨厌北漂了。

前言

在使用Memory Analyzer tool(MAT)分析内存泄漏(一)中,我介绍了内存泄漏的前因后果。在本文中,将介绍MAT如何根据heap dump分析泄漏根源。由于测试范例可能过于简单,很容易找出问题,但我期待借此举一反三。

一开始不得不说说ClassLoader,本质上,它的工作就是把磁盘上的类文件读入内存,然后调用https://www.360docs.net/doc/b818330901.html,ng.ClassLoader.defineClass方法告诉系统把内存镜像处理成合法的字节码。Java 提供了抽象类ClassLoader,所有用户自定义类装载器都实例化自ClassLoader的子类。system class loader在没有指定装载器的情况下默认装载用户类,在Sun Java 1.5中既https://www.360docs.net/doc/b818330901.html,uncher$AppClassLoader。更详细的内容请参看下面的资料。

准备heap dump

请看下面的Pilot类,没啥特殊的。

/**

* Pilot class

* @author rosen jiang

*/

package org.rosenjiang.bo;

public class Pilot{

String name;

int age;

public Pilot(String a, int b){

name = a;

age = b;

}

}

然后再看OOMHeapTest类,它是如何撑破heap dump的。

/**

* OOMHeapTest class

* @author rosen jiang

*/

package org.rosenjiang.test;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

import org.rosenjiang.bo.Pilot;

public class OOMHeapTest {

public static void main(String[] args){

oom();

}

private static void oom(){

Map map = new HashMap();

Object[] array = new Object[1000000];

for(int i=0; i<1000000; i++){

String d = new Date().toString();

Pilot p = new Pilot(d, i);

map.put(i+"rosen jiang", p);

array[i]=p;

}

}

}

是的,上面构造了很多的Pilot类实例,向数组和map中放。由于是Strong Ref,GC自然不会回收这些对象,一直放在heap中直到溢出。当然在运行前,先要在Eclipse中配置VM参数-XX:+HeapDumpOnOutOfMemoryError。好了,一会儿功夫内存溢出,控制台打出如下信息。

https://www.360docs.net/doc/b818330901.html,ng.OutOfMemoryError: Java heap space

Dumping heap to java_pid3600.hprof

Heap dump file created [78233961 bytes in 1.995 secs]

Exception in thread "main" https://www.360docs.net/doc/b818330901.html,ng.OutOfMemoryError: Java heap space

java_pid3600.hprof既是heap dump,可以在OOMHeapTest类所在的工程根目录下找到。MAT安装

话分两头说,有了heap dump还得安装MAT。可以在

https://www.360docs.net/doc/b818330901.html,/mat/downloads.php选择合适的方式安装。安装完成后切换到Memory Analyzer视图。在Eclipse的左上角有Open Heap Dump按钮,按照刚才说的路径找到java_pid3600.hprof文件并打开。解析hprof文件会花些时间,然后会弹出向导,直接Finish即可。稍后会看到下图所示的界面。

MAT工具分析了heap dump后在界面上非常直观的展示了一个饼图,该图深色区域被怀疑有内存泄漏,可以发现整个heap才64M内存,深色区域就占了99.5%。接下来是一个简短的描述,告诉我们main线程占用了大量内存,并且明确指出system class loader加载的"https://www.360docs.net/doc/b818330901.html,ng.Thread"实例有内存聚集,并建议用关键字"https://www.360docs.net/doc/b818330901.html,ng.Thread"进行检查。所以,MAT通过简单的两句话就说明了问题所在,就算使用者没什么处理内存问题的经验。在下面还有一个"Details"链接,在点开之前不妨考虑一个问题:为何对象实例会聚集在内存中,为何存活(而未被GC)?是的——Strong Ref,那么再走近一些吧。

点击了"Details"链接之后,除了在上一页看到的描述外,还有Shortest Paths To the Accumulation Point和Accumulated Objects部分,这里说明了从GC root到聚集点的最短路径,以及完整的reference chain。观察Accumulated Objects部分,java.util.HashMap 和https://www.360docs.net/doc/b818330901.html,ng.Object[1000000]实例的retained heap(size)最大,在上一篇文章中我们知道retained heap代表从该类实例沿着reference chain往下所能收集到的其他类实例的shallow heap(size)总和,所以明显类实例都聚集在HashMap和Object数组中了。这里我们发现一个有趣的现象,既Object数组的shallow heap和retained heap竟然一样,通过

Shallow and retained sizes一文可知,数组的shallow heap和一般对象(非数组)不同,依赖于数组的长度和里面的元素的类型,对数组求shallow heap,也就是求数组集合内所有对象的shallow heap之和。好,再来看org.rosenjiang.bo.Pilot对象实例的shallow heap为何是16,因为对象头是8字节,成员变量int是4字节、String引用是4字节,故总共16字节。

接着往下看,来到了Accumulated Objects by Class区域,顾名思义,这里能找到被聚集的对象实例的类名。org.rosenjiang.bo.Pilot类上头条了,被实例化了290,325次,再返回去看程序,我承认是故意这么干的。还有很多有用的报告可用来协助分析问题,只是本文中的例子太简单,也用不上。以后如有用到,一定撰文详细叙述。

又是perm gen

我们在上一篇文章中知道,perm gen是个异类,里面存储了类和方法数据(与class loader 有关)以及interned strings(字符串驻留)。在heap dump中没有包含太多的perm gen 信息。那么我们就用这些少量的信息来解决问题吧。

看下面的代码,利用interned strings把perm gen撑破了。

/**

* OOMPermTest class

* @author rosen jiang

*/

package org.rosenjiang.test;

public class OOMPermTest {

public static void main(String[] args){

oom();

}

private static void oom(){

Object[] array = new Object[10000000];

for(int i=0; i<10000000; i++){

String d = String.valueOf(i).intern();

array[i]=d;

}

}

}

控制台打印如下的信息,然后把java_pid1824.hprof文件导入到MAT。其实在MAT里,看到的状况应该和“OutOfMemoryError: Java heap space”差不多(用了数组),因为heap dump并没有包含interned strings方面的任何信息。只是在这里需要强调,使用intern()方法的时候应该多加注意。

https://www.360docs.net/doc/b818330901.html,ng.OutOfMemoryError: PermGen space

Dumping heap to java_pid1824.hprof

Heap dump file created [121273334 bytes in 2.845 secs]

Exception in thread "main" https://www.360docs.net/doc/b818330901.html,ng.OutOfMemoryError: PermGen space

倒是在思考如何把class loader撑破废了些心思。经过尝试,发现使用ASM来动态生成类才能达到目的。ASM(https://www.360docs.net/doc/b818330901.html,)的主要作用是处理已编译类(compiled class),能对已编译类进行生成、转换、分析(功能之一是实现动态代理),而且它运行起来足够的快和小巧,文档也全面,实属居家必备之良品。ASM提供了core API和tree API,前者是基于事件的方式,后者是基于对象的方式,类似于XML的SAX、DOM解析,但是使用tree API性能会有损失。既然下面要用到ASM,这里不得不啰嗦下已编译类的结构,包括:

1、修饰符(例如public、private)、类名、父类名、接口和annotation部分。

2、类成员变量声明,包括每个成员的修饰符、名字、类型和annotation。

3、方法和构造函数描述,包括修饰符、名字、返回和传入参数类型,以及annotation。当然还包括这些方法或构造函数的具体Java字节码。

4、常量池(constant pool)部分,constant pool是一个包含类中出现的数字、字符串、类型常量的数组。

已编译类和原来的类源码区别在于,已编译类只包含类本身,内部类不会在已编译类中出现,而是生成另外一个已编译类文件;其二,已编译类中没有注释;其三,已编译类没有package和import部分。

这里还得说说已编译类对Java类型的描述,对于原始类型由单个大写字母表示,Z代表boolean、C代表char、B代表byte、S代表short、I代表int、F代表float、J代表long、D代表double;而对类类型的描述使用内部名(internal name)外加前缀L和后面的分号共同表示来表示,所谓内部名就是带全包路径的表示法,例如String的内部名是java/lang/String;对于数组类型,使用单方括号加上数据元素类型的方式描述。最后对于方法的描述,用圆括号来表示,如果返回是void用V表示,具体参考下图。

下面的代码中会使用ASM core API,注意接口ClassVisitor是核心,FieldVisitor、MethodVisitor都是辅助接口。ClassVisitor应该按照这样的方式来调用:visit visitSource? visitOuterClass? ( visitAnnotation | visitAttribute )*( visitInnerClass | visitField | visitMethod )* visitEnd。就是说visit方法必须首先调用,再调用最多一次的visitSource,再调用最多一次的visitOuterClass方法,接下来再多次调用visitAnnotation和visitAttribute方法,最后是多次调用visitInnerClass、visitField和visitMethod方法。调用完后再调用visitEnd方法作为结尾。

注意ClassWriter类,该类实现了ClassVisitor接口,通过toByteArray方法可以把已编译类直接构建成二进制形式。由于我们要动态生成子类,所以这里只对ClassWriter感兴趣。首先是抽象类原型:

/**

* @author rosen jiang

* MyAbsClass class

*/

package org.rosenjiang.test;

public abstract class MyAbsClass {

int LESS = -1;

int EQUAL = 0;

int GREATER = 1;

abstract int absTo(Object o);

}

其次是自定义类加载器,实在没法,ClassLoader的defineClass方法都是protected的,要加载字节数组形式(因为toByteArray了)的类只有继承一下自己再实现。

/**

* @author rosen jiang

* MyClassLoader class

*/

package org.rosenjiang.test;

public class MyClassLoader extends ClassLoader {

public Class defineClass(String name, byte[] b) {

return defineClass(name, b, 0, b.length);

}

}

最后是测试类。

/**

* @author rosen jiang

* OOMPermTest class

*/

package org.rosenjiang.test;

import java.util.ArrayList;

import java.util.List;

import org.objectweb.asm.ClassWriter;

import org.objectweb.asm.Opcodes;

public class OOMPermTest {

public static void main(String[] args) {

OOMPermTest o = new OOMPermTest();

o.oom();

}

private void oom() {

try {

ClassWriter cw = new ClassWriter(0);

cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRAC T,

"org/rosenjiang/test/MyAbsClass", null, "java/lang/Object",

new String[] {});

cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.AC C_STATIC, "LESS", "I",

null, new Integer(-1)).visitEnd();

cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.AC C_STATIC, "EQUAL", "I",

null, new Integer(0)).visitEnd();

cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.AC C_STATIC, "GREATER", "I",

null, new Integer(1)).visitEnd();

cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT, "absT o",

"(Ljava/lang/Object;)I", null, null).visitEnd();

cw.visitEnd();

byte[] b = cw.toByteArray();

List classLoaders = new ArrayList();

while (true) {

MyClassLoader classLoader = new MyClassLoader();

classLoader.defineClass("org.rosenjiang.test.MyAbsClass", b);

classLoaders.add(classLoader);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

不一会儿,控制台就报错了。

https://www.360docs.net/doc/b818330901.html,ng.OutOfMemoryError: PermGen space

Dumping heap to java_pid3023.hprof

Heap dump file created [92593641 bytes in 2.405 secs]

Exception in thread "main" https://www.360docs.net/doc/b818330901.html,ng.OutOfMemoryError: PermGen space

打开java_pid3023.hprof文件,注意看下图的Classes: 88.1k和Class Loader: 87.7k部分,从这点可看出class loader加载了大量的类。

更进一步分析,点击上图中红框线圈起来的按钮,选择Java Basics——Class Loader Explorer 功能。打开后能看到下图所示的界面,第一列是class loader名字;第二列是class loader已定义类(defined classes)的个数,这里要说一下已定义类和已加载类(loaded classes)了,当需要加载类的时候,相应的class loader会首先把请求委派给父class loader,只有当父class loader加载失败后,该class loader才会自己定义并加载类,这就是Java自己的“双亲委派加载链”结构;第三列是class loader所加载的类的实例数目。

在Class Loader Explorer这里,能发现class loader是否加载了过多的类。另外,还有Duplicate Classes功能,也能协助分析重复加载的类,在此就不再截图了,可以肯定的是MyAbsClass被重复加载了N多次。

最后

其实MAT工具非常的强大,上面故弄玄虚的范例代码根本用不上MAT的其他分析功能,所以就不再描述了。其实对于OOM不只我列举的两种溢出错误,还有多种其他错误,但我想说的是,对于perm gen,如果实在找不出问题所在,建议使用JVM的-verbose参数,该参数会在后台打印出日志,可以用来查看哪个class loader加载了什么类,例:“[Loaded

org.rosenjiang.test.MyAbsClass from org.rosenjiang.test.MyClassLoader]”。

全文完。

参考资料

memoryanalyzer Blog java类加载器体系结构ClassLoader

WimTool使用教程

WimTool使用教程 一、基本介绍: 1、WimTool并不是Imagex的GUI,可以脱离Imagex而独立使用。 2、WimTool能提供普通用户对WIM格式文件最常用的处理功能,如制作映像文件、挂载映像、解开Wim映像到硬盘的目录和向现存的Wim文件加入新的映像卷等。 3、在WimTool中,对Wim文件进行操作处理时,界面元素给用户提供了相当的显示信息,对Wim 文件最常见的处理出现失败时,WimTool会提供失败的说明。 4、WimTool界面采用分页式设计,每页都提供了必要的操作说明、选项要求和注意事项。初次使用的用户,请先阅读每页的操作说明。 二、运行环境: Windows XP/2K3/Vista及它们相应的PE系统,在上述系统中安装WimFltr组件后可以使用全部功能,如果没有安装WimFltr组件,只需一个位于同目录中的WIMGAPI.DLL文件也可使用大部分常用功能。 三、功能简介: 1、支持制作不同压缩类型的映像文件。在制作新的映像文件时,用户可以给新的映卷指定映卷名称和映卷描述,并加上启动标记,同时用户可以在WimTool中指定压缩类型。 2、支持向现有的映像文件添加新的映卷,并可指定新映卷的名称和描述,并加上启动标记。向现有映像文件添加新的映像卷时,WimTool会自动检测原映像文件的压缩类型,并使新加入的映像卷与之匹配。 3、支持挂载和卸载Wim文件。用WimTool挂载Wim文件时,用户可以选择指定的映像文件和挂载目录,同时也可指定挂载方式(是否可写或只读)。 4、支持向硬盘解开(应用)Wim文件中指定的映像卷,包括解开分割包。WimTool解开Wim文件时会自动检测用户指定的Wim是否属分割包,并将其它分包系列也解开到指定目录。 5、支持将单一的大体积Wim文件按指定大小分割,分包文件既支持WimTool解开也支持Imagex解开。 6、支持将某一Wim文件中存在的映像卷导入到另一个Wim文件中。导入映像卷的目标Wim文件既支持Imagex操作,也支持WimTool操作,如挂载、解开等。 7、支持从已有的Wim文件中删除已有的映像卷条目。 8、支持查看Wim文件的基本属性和详细信息,如映卷名称、映卷描述、压缩类型、映像卷数目、是否属分割包等。 9、支持列出系统所有挂载的Wim映像及其挂载目录、挂载方式等。 10、支持修改现有的Wim映像文件中的某个映卷的名称和描述,并加上启动标记。 11、支持Mount 、MountRW 、UnMount 、Apply 、Capture 和Append 六项命令行参数及它们的常用选项。 12、支持WIM映像文件与WimTool程序直接关联,并可创建右键菜单,方便挂载或打开WIM映像文件。 13、支持列出映像内的文件目录,这个功能相当于ImageX的/DIR参数,可以在PE系统中使用。 14、支持通过配置文件定义捕获映像或解开映像的规则。WimTool的配置文件与ImageX的兼容。在WimTool内置了一份默认的配置文件,这个配置文件与ImageX的默认配置文件相同。 15、在图形视窗界面中,WimTool对制作映像、解开映像、导出映像、列文件目录等过程提供用户中止操作支持。 16、注册WIM文件关联后可通过双击WIM文件打开WIM映像内的程序或启动到WimTool的图形界面。 17、支持鼠标右键扩展菜单快速展开WIM映像文件和快速制作WIM映像文件,这两项操作提供处理

java技术面试必问:JVM 内存模型讲解

java技术面试必问:JVM 内存模型讲解 今天我们就来聊一聊Java内存模型,面试中面试官会通过考察你对jvm的理解更深入得了解你的水平。在了解jvm内存模型前我们先回顾下,java程序的执行过程: java文件在通过java编译器生产.class 字节码文件,然后由jvm中的类加载器加载各个类中的字节码文件,加载完成后由jvm执行引擎执行,在整个加载过程中,jvm用一段空间来存储程序执行期间需要的数据和相关信息,这个空间就叫做jvm内存。 一、JVM 的重要性 首先你应该知道,运行一个 Java 应用程序,我们必须要先安装 JDK 或者 JRE 。这是因为 Java 应用在编译后会变成字节码,然后通过字节码运行在 JVM 中,而 JVM 是JRE 的核心组成部分。 二、优点 JVM 不仅承担了 Java 字节码的分析(JIT compiler)和执行(Runtime),同时也内置了自动内存分配管理机制。这个机制可以大大降低手动分配回收机制可能带来的内存泄露和内存溢出风险,使 Java 开发人员不需要关注每个对象的内存分配以及回收,从而更专注于业务本身。 三、缺点 这个机制在提升 Java 开发效率的同时,也容易使 Java 开发人员过度依赖于自动化,弱化对内存的管理能力,这样系统就很容易发生 JVM 的堆内存异常、垃圾回收(GC)的不合适以及 GC 次数过于频繁等问题,这些都将直接影响到应用服务的性能。 四、内存模型 JVM 内存模型共分为5个区:堆(Heap)、方法区(Method Area)、程序计数器(Program Counter Register)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)。 其中,堆(Heap)、方法区(Method Area)为线程共享,程序计数器(Program Counter Register)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)为线程隔离。 五、堆(Heap) 堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。 堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 区和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成。

VisionPro控件的使用

VisionPro控件的使用C# 开发篇 VisionPro 常用控件的说明 1.工具设置窗体 a.CogPMAlignEditV2 [ 模版匹配设置窗体控件] CogPMAlignEditV2.Subject : 工具关联对象 如:CogPMAlignEditV2.Subject = CogPMAlignTool1; CogPMAlignTool1 的类型为CogPMAlignTool b.CogFixtureEditV2 [ 坐标定位设置窗体控件] CogFixtureEditV2.Subject : 工具关联对象 如:CogFixtureEditV2.Subject = CogFixture Tool1; CogFixture Tool1的类型为CogFixture Tool c.CogCalibNPointToNPointEditV2 [ N点坐标矫正设置窗体控件]

CogCalibNPointToNPointEditV2.Subject : 工具关联对象 如:CogCalibNPointToNPointEditV2.Subject = CogCalibNPointToNPoint Tool1; CogCalibNPointToNPoint Tool1的类型为CogCalibNPointToNPoint Tool ------------------------------------------------- 其中: 未矫正X : 像素坐标X 未矫正Y : 像素坐标Y 原始的已校正X : 物理坐标X 原始的已校正Y : 物理坐标Y ------------------------------------------------- d.CogFindCircleEditV2 [ 圆形寻找设置窗体控件] CogFindCircleEditV2.Subject : 工具关联对象 如:CogFindCircleEditV2.Subject = CogFindCircle Tool1; CogFindCircle Tool1的类型为CogFindCircle Tool e.CogAcqFifoEditV2 [ 相机信息设置窗体控件]

JAVA内存分析指引201007_V0.2

JA V A内存分析指引 2010-07 1 环境说明 根据一般项目部署情况,生产环境以WebSphere5和WebSphere6为主,本文中所涉及环境变量也主要采用WebSphere的相关环境变量。 WebSphere5安装目录(默认): Windows:C:\Program Files\WebSphere\AppServer AIX:/usr/WebSphere/ AppServer WebSphere5日志路径 Windows:C:\Program Files\WebSphere\AppServer\logs\server1 AIX: /usr/WebSphere/ AppServer/logs/server1 WebSphere6安装目录(默认): Windows:C:\Program Files\IBM\WebSphere\AppServer AIX:/usr/IBM/WebSphere/AppServer WebSphere6日志路径: Windows:C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1 AIX: /usr/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1 2 内存溢出原理 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。 为了解决Java中内存溢出问题,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的。 Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。GC为了能够正确释放对象,必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。

Synchro8详细使用教程

Synchro 8详细使用教程 Synchro软件是一套完整的城市路网信号配时分析与优化的仿真软件。与道路通行能力手册(HCM2000)完全兼容,可与道路通行能力分析软件(HCS) 及车流仿真软件(SimTraffic)相互衔接来整合使用,并且具备与传统交通仿真 软件CORSIM,TRANSYT-7F等的接口,它生成的优化信号配时方案可以直接 输入到Vissim软件中进行微观仿真。Synchro软件既具有直观的图形显示,又具有较强的计算能力,能很好地满足信号配时评价的各项要求,其仿真结果对交通 管理者具有极高的参考价值,是一套易学易用、能与交通管理与控制的专业知识密切结合的有效分析工具。 (一)路网背景及比例设置 1、在百度地图上截取研究路网所在的区域图片作为描绘路网的底图 2、将截取的图片导入synchro,文件-选择背景,出现下图对话框点击add fiel,加载背景图片 sun 3、设置比例,设置比例是为了能将我们在软件里设置的路段长度与实际长度匹配起来。如下图,点击equals选项下的measure,软件会让你在右侧的背景图上选取两点,之后在百度地图上测量出所选两点间的实际距离,输入到metres 框内,点击OK,背景图和比例就设置好了。

sun (二)绘制路网 利用软件右侧的工具栏,进行路段的绘制,点击点Add Link,在底图上构建实际路网,同时自动生成交叉口。路段经连接后,即可成为一处交叉口;SYNCHRO程序的内定值为信号交叉口,但也可通过该交叉口的属性窗口,将其控制型态更改为非信号控制交叉口。

路段属性窗口 交叉口属性窗口 (三)路段及交叉口参数输入 左击选中节点,利用软件上部的工具栏中的lane settings ,输入相交道 路的相关参数。 Synchro 的路段窗口主要是针对分析路网的车道几何与交通条件,如车道配 置(Lanes and Sharing)、理想饱和流率(Ideal Saturation Flow)、车道宽(Lane Width) 、sun

详细功能介绍及使用说明

关键使用说明在使用过程中的翻译机最下方的信息栏中都有简明说明,本文档将更详细的对每个功能及使用技巧做说明: 一、基本功能 1、设置文件——保存设置文件:保存当前所有设置到SFSave文件夹中,便于下次导入使用而不用重复操作 2、设置文件——导入设置文件:从SFSave文件夹中导入指定的设置文件从而沿用之前保存的设置 3、窗口——窗口置顶:可以控制窗口是否永久置顶 4、帮助:内有简明使用步骤,BUG反馈途径等帮助信息 5、推广:雨滴网相关的网址 6、获取游戏窗口句柄:划定识别区之前以及导入设置文件之后的必须步骤,在不更换游戏程序的前提下不用重复捕获。点击按钮后会有特殊蓝色半透明阴影出现(以下简称迷雾)。迷雾会随着鼠标的位置识别有句柄的窗口并将其覆盖(常见于WIN7或以上系统)或交替闪烁(常见于XP系统)。鼠标移动到游戏窗口后迷雾自动将其覆盖,左键单击迷雾即可捕获覆盖的窗口,右键单击放弃捕获。捕获完毕后会弹出确认窗口,若正确捕获,窗口内能看到缩小的游戏画面。 7、划定识别区:在游戏画面上直接划定一个矩形区域,本软件会对该区域进行OCR(光学字符识别)从而提取文字。点击按钮后覆盖游戏窗口的迷雾又会出现,直接在迷雾上框出要识别的区域即可,操作方式与普通截图软件类似(即左键单击想划定的区域的起点,鼠标移到终点再左键单击一次即可)。右键可重画已经指定起点但还未指定终点的识别区,若起点也未指定,则会退出划区模式而放弃划区。在之前划定过识别区的前提下,显示的绿框是之前已经划定的识别区,红框是正要划定/修改的识别区。 8、修改识别区:点击并成功“划定识别区”后该按钮会变为“修改识别区”。功能与“划定识别区”相同,直接无视之前的识别区在迷雾上划定新识别区即可。右键单击放弃修改。 9、激活:获取游戏窗口句柄并划定识别区后,或者,导入设置文件并获取游戏窗口句柄后;就具备了激活翻译循环的基本条件。点击按钮即可激活翻译循环。程序将自动开始循环翻译。 10、暂停:点击“激活”按钮后,该按钮将变为“暂停”。点击按钮后将停止翻译循环。 11、添加翻译栏:可以新增一行翻译栏,多个翻译栏使用的是同一游戏句柄,故新增翻译栏不必重新获取游戏句柄。但不同的翻译栏有各自的设置,互不影响,需要单独进行设定。 12、删除翻译栏:删除最下方的翻译栏。为防止手滑删除,删除后大部分设置仍会保留。 13、修改标签:“激活”按钮上方的标签可以修改,便于用户记忆翻译栏对应翻译的是什么东东。 二、扩展功能【注意】:以下设置只有点确定后才生效,点取消放弃所做的任何更改。 1、自动化设置:点击后弹出对应设置窗口,能切换手动模式和自动模式(默认)。自动模式下能设定翻译时间间隔(默认2秒)以减少CPU开销。时间间隔可以输入0~99的整数。CPU性能在酷睿I3或以上的可以尝试设置为0秒以获得最佳性能。手动模式下每次翻译完毕后会自动停止翻译,需要手动激活才进行一次识别、翻译。 2、真人语音设置:点击后弹出对应设置窗口,能进行真人语音朗读的相关设置,包括:是否开启、音量、是否等待朗读完毕再开始下一轮翻译。 提示:点击“激活”按钮下方的小喇叭可以直接开启/关闭语音朗读。

java内存泄露定位与分析

使用IBM 性能分析工具解决生产环境中的性能问题(javacore) 上一篇 / 下一篇 2012-06-01 14:14:01 / 个人分类:javacore 查看( 655 ) / 评论( 0 ) / 评分( 0 / 0 ) https://www.360docs.net/doc/b818330901.html,/developerworks/cn/java/j-lo-javacore/index.html 序言 企业级应用系统软件通常有着对并发数和响应时间的要求,这就要求大量的用户能在高响应时间内完成业务操作。这两个性能指标往往 决定着一个应用系统软件能否成功上线,而这也决定了一个项目最终能否验收成功,能否得到客户认同,能否继续在一个行业发展壮大 下去。由此可见性能对于一个应用系统的重要性,当然这似乎也成了软件行业的不可言说的痛——绝大多数的应用系统在上线之前, 项目组成员都要经历一个脱胎换骨的过程。 生产环境的建立包含众多方面,如存储规划、操作系统参数调整、数据库调优、应用系统调优等等。这几方面互相影响,只有经过不断 的调整优化,才能达到资源的最大利用率,满足客户对系统吞吐量和响应时间的要求。在无数次的实践经验中,很多软件专家能够达成 一致的是:应用系统本身的优化是至关重要的,否则即使有再大的内存,也会被消耗殆尽,尤其是产生OOM(Out Of Memory)的错 误的时候,它会贪婪地吃掉你的内存空间,直到系统宕机。 内存泄露—难啃的骨头 产生OOM 的原因有很多种,大体上可以简单地分为两种情况,一种就是物理内存确实有限,发生这种情况时,我们很容易找到原因,但是它一般不会发生在实际的生产环境中。因为生产环境往往有足以满足应用系统要求的配置,这在项目最初就是根据系统要求进行购 置的。 另外一种引起OOM 的原因就是应用系统本身对资源的的不恰当使用、配置,引起内存使用持续增加,最终导致JVM Heap Memory 被耗尽,如没有正确释放JDBC 的Connection Pool 中的对象,使用Cache 时没有限制Cache 的大小等等。本文并不针对各种情 况做讨论,而是以一个项目案例为背景,探索解决这类问题的方式方法,并总结一些最佳实践,供广大开发工程师借鉴参考。 项目背景介绍 项目背景: 1. 内网用户500 人,需要同时在线进行业务操作(中午休息一小时,晚6 点下班)。 2. 生产环境采用传统的主从式,未做Cluster ,提供HA 高可用性。 3. 服务器为AIX P570,8U,16G,但是只有一半的资源,即4U,8G 供新系统使用。 项目三月初上线,此前笔者与架构师曾去客户现场简单部署过一两次,主要是软件的安装,应用的部署,测一下应用是不是能够跑起来,算作是上线前的准备工作。应用上线(试运行)当天,项目组全体入住客户现场,看着用户登录数不断攀升,大家心里都没有底,高峰 时候到了440,系统开始有点反应变慢,不过还是扛下来了,最后归结为目前的资源有限,等把另一半资源划过来,就肯定没问题了。(须知增加资源,调优的工作大部分都要重新做一遍,系统级、数据库级等等,这也是后面为什么建议如果资源可用,最好一步到位的

Iperf详细使用方法

Iperf使用方法 Iperf 是一个网络性能测试工具。Iperf可以测试TCP和UDP带宽质量。Iperf可以测量最大TCP带宽,具有多种参数和UDP特性。Iperf可以报告带宽,延迟抖动和数据包丢失。 Iperf使用方法与参数说明 参数说明 -s 以server模式启动,eg:iperf -s -c host 以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23 通用参数 -f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2 -l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16 -m 显示tcp最大mtu值 -o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:\iperflog.txt -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999 -u 使用udp协议 -w 指定TCP窗口大小,默认是8KB -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -C 兼容旧版本(当server端和client端版本不一样时使用) -M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包 server专用参数 -D 以服务方式运行ipserf,eg:iperf -s -D -R 停止iperf服务,针对-D,eg:iperf -s -R client端专用参数 -d 同时进行双向传输测试 -n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000 -r 单独进行双向传输测试 -t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5 -F 指定需要传输的文件 -T 指定ttl值

deploytool使用的具体说明

通常编写的matlab程序只能在装有matlab的机器上执行,但是没有安装matlab的怎么办呢?这个可以使用matlab的自带工具-Deploy Tool。 Matlab的Deploy Tools 可以方便的将matlab工程编译成所支持的类型,例如一般的Windows应用程序,Matlab for .NET/COM ,Matlab for Java,Matlab for Excel 等。 其原理就是先使用MCC 编译器根据你的m文件生成相应的c语言文件以及数据文件,然后在调用C/C++编译器编译成可执行文件或者控件库。 在Matlab 2007a 中Deploy Tool其实是一个MCC的前端界面(用MCC的命令行参数一样可以完成编译工作) 下面是用Deploy Tool来编matlab工程。 首先创建prj工程,从菜单中定位到“New”-》“Deployment Project”然后会提示选择类型

然后添加文件

接着你就可以编译了 第一次编译会让你去选择C/C++编译器,运行mbuild -setup 之后matlab会自动搜索系统所安装的C/C++编译器, 然后让你给出选择,matlab自带了LCC编译器,不过可以使用VC的编译器。 选择好了之后你就可以编译了,编译之前你可以设置工程属性,例如通用设置:

可以指定生成的中间文件的路径,编译选项,等等,你还可以设置选择针对哪些工具箱进行扫描:

当然你还可以手动设置C/C++编译器路径,头文件、库文件目录,警告等级等 不过想要你的程序在没有安装Matlab的机器上运行,还有一点要注意,就是Matlab编译出来的程序需要用到Matlab的一些包括但不限于数学、图形等动态链接库,这些是你的程序必要的运行时环境,你可以拷贝 (MatlabDIR)\ toolbox\\toolbox\compiler\deploy\win32\MCRRegCOMComponent.exe 到目标机器安装,然后就有了运行时环境,当然使用Deployment Tool工具可以设置自动打包这个运行时,具体在设置页勾选“Include MATLAB Comptent Runtime(MCR)”:

java内存空间详解

硬盘 heap stack Data code 内存 程序 操作系统代码 程序代码 New ,在堆里面为属性分配空间,初始化(String 默认值为null ) 声明的时候非配空间,初始值为null (局部变量,方法参数) 全局变量 存放程序所需要的代码 类变量,全局字符串,常量存放在数据段

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java 在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量

◆非RAM存储:硬盘等永久存储空间 Java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 Java内存分配中的堆 堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是Java 比较占内存的原因。 实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针! 常量池(constant pool) 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如: ◆类和接口的全限定名; ◆字段的名称和描述符; ◆方法和名称和描述符。 虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和

书名号使用方法(详细)

书名号使用方法(详细) 书名号是用于标明书名、篇名、报刊名、文件名、戏曲名、歌曲名、图画名等的标点符号,亦用于歌曲、电影、电视剧等与书面媒介紧密相关的文艺作品。书名号分为双书名号(《》)和单书名号(〈〉),书名号里还有书名号时,外面一层用双书名号,里面一层用单书名号;若单书名号里有还有书名号,则单书名号里用双书名号。 (一)书名号的基本用法 1. 书名、篇名、报纸名、刊物名,用书名号标示。示例:《三国演义》‖《人的正确思想是从那里来的?》‖《参考消息》‖《大众电影》‖《瞭望》杂志‖《中华儿科杂志》。 2. 法律、规章、规定、合同等文书的标题,用书名号标示。示例:《新闻出版统计管理办法》‖《汉语拼音方案》。 3. 文化产品(电影、戏剧、绘画、歌曲、舞蹈、摄影、邮票等)的题目,用书名号标示。示例:影片《红高粱》‖小提琴协奏曲《梁祝》‖独舞《月光下》‖黑白摄影《救死扶伤》‖董希文的《开国大典》‖石雕《和平》‖湘绣《龙凤呈祥》‖特种邮票《中国皮影》‖相声《钓鱼》‖小品《英雄母亲的一天》‖游戏软件《仙剑奇侠传》。 4. 报纸、杂志、电台、电视台的栏目与板块名称,用书名号标示。示例:该报《人民子弟兵》专栏‖副刊《笔会》‖中央电视台专题节目《体育沙龙》‖北京文艺台《周末三人谈》专题节目。 (二)提示 1. 书名号的形式分双书名号“《》”和单书名号“〈〉”。书名号里面还要用书名号时,外面一层用双书名号,里面一层用单书名号。如果偶尔出现三层书名号时,最里一层书名号用双书名号。示例: ⑴《〈中国工人〉发刊词》发表于1940年2月7日。 ⑵他的毕业论文《鲁迅先生〈《呐喊》自序〉试析》获得一致好评。 2. 单书名号的形式是“〈〉”,不可用数学上的小于号和大于号的组合形式“< >”代替中文单书名号。 3. 书名、篇章名等如果使用缩略形式,照样要用书名号,示例:阅读《毛选》四卷‖参见《现汉》第234页‖《沙》剧的布景设计。 4. 丛书名用书名号。至于“丛书”一词放在书名号里面还是外面,要看图书本身书名(主要指封面)是否有“丛书”字样。示例:《万有文库》‖《四库丛刊》‖《汉译世界学术名著丛书》‖《中国音乐文物大系》‖《20世纪心理学通览》丛书‖《往事与回忆》传记丛书。

赤道仪详细使用方法

赤道仪的使用方法 追踪因日周运动而移动的天体,最简单的方法是使用赤道仪式台架,确实比经纬仪方便得多。只要明白了使用的要领,作目视观则或照相均会产生很好的效果。晚间的星空,以北天极和南天极联机的自转轴为中心,每日旋转一次,称为日周运动。在赤道仪的台架上,把极轴(或称赤经轴)向北天极延长(在南半球时向南天极),就能简单地追踪星星的移动。换句话说,让赤道仪的极轴和地球的地轴平行,这个作业称为极轴调整,使用赤道仪时绝不能忘记,事先要与极轴对准平。 赤道仪的台架分为附有赤经、赤纬微动杆的, 以及附装极轴马达追踪式两种。附有微动杆的比经纬台的星星追踪方便,但须连续手动以便继续追踪,如果预算许可,最好是采用马达追踪式,会方便得多。必须调整赤道仪赤纬轴和极轴全体的平衡。如果平衡状态调节良好,固定螺丝放松时镜筒会静止,赤道仪的运转就会很圆滑,使用起来很平稳。 近年生产商在高级的赤道仪加进了GOTO功能,使用者可以指令望远镜自动指向观察目标。但耗电量大,野外观星时要携带大型蓄电池。 赤道仪的种类有很多。业余天文爱好者最常用的赤道仪有两种:分别是德国式及叉式赤道仪。德国式赤道仪适合折射、反射及折反射望远镜。而叉式赤道仪一般配合折反射望远镜使用。叉式赤道仪比德国式优胜的是不须要平衡锤,减轻仪器重量,方便野外观星。但是业余级数的叉式赤道仪稳定性不及德国式赤道仪。博冠系列望远镜用的赤道仪是德国式的赤道仪(如图)。 那我们就主要讲讲德国式赤道仪的使用方法吧! (一)赤道仪简介 肉眼可见的天体,用寻星镜就可对准,赤道仪之作微调跟踪之用。而深空天体就必须利用赤道仪的时角、赤纬度盘才能找到。 赤道仪有三个轴: 1.地平轴。垂直于地平面,下端与三脚架台连接,上端与极轴连接,有地平高度刻度盘。绕地平轴旋转可调整望远镜的地平方位角。 2.极轴。一端与地平轴相连,上下扳动极轴可调整地平高度角。另一端与赤纬轴成90o角连接,装有时角度盘,用于望远镜指向的时角(赤经)调整。 3.赤纬轴。与极轴成90o相连,上端与主镜筒成90o相连,以保证镜筒与极轴平行。下端连接平衡锤,装有赤纬度盘,用于望远镜指向的赤纬度调整。 (二)对准、观测深空暗天体 第一步:极轴调整。使望远镜极轴和地球自转轴平行,指向北天极。 1.主镜与赤道仪、三角架连接好,把有“N”标志的一条腿摆在正北方。调整三角架高度,使三角架台水平。 2.松开极轴(赤经轴)制紧螺钉,把主镜旋转到左边或右边。松开平衡锤制紧螺钉,移动平衡锤,使望远镜与锤平衡。把望远镜旋回上方,制紧螺钉。 3.松开地平制紧螺钉,转动赤道仪,使极轴(望远镜)指向北方(指南针定向),制紧螺钉。

GATK使用方法详解-plob最详尽说明书

GATK使用方法详解 一、使用GATK前须知事项: (1)对GATK的测试主要使用的是人类全基因组和外显子组的测序数据,而且全部是基于illumina数据格式,目前还没有提供其他格式文件(如Ion Torrent)或者实验设计(RNA-Seq)的分析方法。 (2)GATK是一个应用于前沿科学研究的软件,不断在更新和修正,因此,在使用GATK进行变异检测时,最好是下载最新的版本,目前的版本是2.8.1(2014-02-25)。下载网站:https://www.360docs.net/doc/b818330901.html,/gatk/download。 (3)在GATK使用过程中(见下面图),有些步骤需要用到已知变异信息,对于这些已知变异,GATK只提供了人类的已知变异信息,可以在GATK的FTP 站点下载(GATK resource bundle)。如果要研究的不是人类基因组,需要自行构建已知变异,GATK提供了详细的构建方法。 (4)GATK在进行BQSR和VQSR的过程中会使用到R软件绘制一些图,因此,在运行GATK之前最好先检查一下是否正确安装了R和所需要的包,所需要的包大概包括ggplot2、gplots、bitops、caTools、colorspace、gdata、gsalib、reshape、RColorBrewer等。如果画图时出现错误,会提示需要安装的包的名称。 二、GATK的使用流程 GATK最佳使用方案:共3大步骤,即: 原始数据的处理 --> 变异检测--> 初步分析。 原始数据的处理

1. 对原始下机fastq文件进行过滤和比对(mapping) 对于Illumina下机数据推荐使用bwa进行mapping。 Bwa比对步骤大致如下: (1)对参考基因组构建索引: 例子:bwa index -a bwtsw hg19.fa。 构建索引时需要注意的问题:bwa构建索引有两种算法,两种算法都是基于BWT 的,这两种算法通过参数-a is 和-a bwtsw进行选择。其中-a bwtsw对于短的参考序列是不工作的,必须要大于等于10Mb;-a is是默认参数,这个参数不适用于大的参考序列,必须要小于等于2G。 (2)寻找输入reads文件的SA坐标。 对于pair end数据,每个reads文件单独做运算,single end数据就不用说了,只有一个文件。 pair end: bwa aln hg19.fa read1.fq.gz -t 4 -I > read1.fq.gz.sai bwa aln hg19.fa read2.fq.gz -t 4 -I > read2.fq.gz.sai single end: bwa aln hg19.fa read.fq.gz -l 30 -k 2 -t 4 -I > read.fq.gz.sai 主要参数说明: -o int:允许出现的最大gap数。 -e int:每个gap允许的最大长度。 -d int:不允许在3’端出现大于多少bp的deletion。 -i int:不允许在reads两端出现大于多少bp的indel。 -l int:Read前多少个碱基作为seed,如果设置的seed大于read 长度,将无法继续,最好设置在25-35,与-k 2 配合使用。 -k int:在seed中的最大编辑距离,使用默认2,与-l配合使用。 -t int:要使用的线程数。

JAVA内存溢出解决方案

JAVA内存溢出 解决方案 1. 内存溢出类型 1.1. https://www.360docs.net/doc/b818330901.html,ng.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。 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)那么就会产生此错误信息了。 一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况) set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 1.2. https://www.360docs.net/doc/b818330901.html,ng.OutOfMemoryError: Java heap space 第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。

JAVA内存泄露专题

内存泄露与内存溢出 1定义 1、内存泄漏:一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而造成那部分内存不可用的情况。 2、内存溢出:指内存不够使用而抛出异常,内存泄露是其形成的原因之一。 2危害 会导致新的资源分配请求无法完成,引起系统错误,最后导致系统崩溃。 3内存泄漏分类 4 内存泄露/溢出发生的区域

5内存溢出异常 6内存溢出常见原因 7发生内存泄露的情形Java内存泄露根本原因是什么呢?

答:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。 具体主要有如下几大类: 7.1 静态集合类引起内存泄露 像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。 例: 解析: 在这个例子中,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身(o=null),那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。因此,如果对象加入到Vector 后,还必须从Vector 中删除,最简单的方法就是将Vector对象设置为null。 7.2创建过大对象

以上代码运行时瞬间报错。 7.3监听器 在java 编程中,我们都需要和监听器打交道,通常一个应用当中会用到很多监听器,我们会调用一个控件的诸如addXXXListener()等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。 7.4 各种连接 比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。对于Resultset 和Statement 对象可以不进行显式回收,但Connection 一定要显式回收,因为Connection 在任何时候都无法自动回收,而Connection一旦回收,Resultset 和Statement 对象就会立即为NULL。但是如果使用连接池,情况就不一样了,除了要显式地关闭连接,还必须显式地关闭Resultset Statement 对象(关闭其中一个,另外一个也会关闭),否则就会造成大量的Statement 对象无法释放,从而引起内存泄漏。这种情况下一般都会在try里面去的连接,在finally里面释放连接。 7.5 内部类和外部模块等的引用 内部类的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。此外程序员还要小心外部模块不经意的引用,例如程序员A 负责A 模块,调用了B 模块的一个方法如: public void registerMsg(Object b); 这种调用就要非常小心了,传入了一个对象,很可能模块B就保持了对该对象的引用,这时候就需要注意模块B 是否提供相应的操作去除引用。 7.6 单例模式 不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露

java内存模型

12.Java内存模型 (原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来查阅了国外很多文档才发现其实JVM内存模型的内容还蛮多的,所以直接作为一个章节的基础知识来讲解,可能该章节概念的东西比较多。一个开发Java的开发者,一旦了解了JVM内存模型就能够更加深入地了解该语言的语言特性,可能这个章节更多的是概念,没有太多代码实例,所以希望读者谅解,有什么笔误来Email告知:silentbalanceyh@https://www.360docs.net/doc/b818330901.html,,本文尽量涵盖所有Java语言可以碰到的和内存相关的内容,同样也会提到一些和内存相关的计算机语言的一些知识,为草案。因为平时开发的时候没有特殊情况不会进行内存管理,所以有可能有笔误的地方比较多,我用的是Windows平台,所以本文涉及到的与操作系统相关的只是仅仅局限于Windows平台。不仅仅如此,这一个章节牵涉到的多线程和另外一些内容并没有讲到,这里主要是结合JVM内部特性把本章节作为核心的概念性章节来讲解,这样方便初学者深入以及彻底理解Java 语言) 本文章节: 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介 i.内存模型概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Java同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型。究竟什么是内存模型?内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,这点没有错,但是编译器、运行库、处理器或者系统缓存可以有特权在变量指定内存位置存储或者取出变量的值。【JMM】(Java Memory Model的缩写)允许编译器和缓存以数据在处理器特定的缓存(或寄存器)和主存之间移动的次序拥有重要的特权,除非程序员使用了final或synchronized明确请求了某些可见性的保证。 1)JSR133:

生物信息学分析方法

核酸和蛋白质序列分析 蛋白质, 核酸, 序列 关键词:核酸序列蛋白质序列分析软 件 在获得一个基因序列后,需要对其进行生物信息学分析,从中尽量发掘信息,从而指导进一步的实验研究。通过染色体定位分析、内含子/外显子分析、ORF分析、表达谱分析等,能够阐明基因的基本信息。通过启动子预测、CpG岛分析和转录因子分析等,识别调控区的顺式作用元件,可以为基因的调控研究提供基础。通过蛋白质基本性质分析,疏水性分析,跨膜区预测,信号肽预测,亚细胞定位预测,抗原性位点预测,可以对基因编码蛋白的性质作出初步判断和预测。尤其通过疏水性分析和跨膜区预测可以预测基因是否为膜蛋白,这对确定实验研究方向有重要的参考意义。此外,通过相似性搜索、功能位点分析、结构分析、查询基因表达谱聚簇数据库、基因敲除数据库、基因组上下游邻居等,尽量挖掘网络数据库中的信息,可以对基因功能作出推论。上述技术路线可为其它类似分子的生物信息学分析提供借鉴。本路线图及推荐网址已建立超级链接,放在北京大学人类疾病基因研究中心网站(https://www.360docs.net/doc/b818330901.html,/science/bioinfomatics.htm),可以直接点击进入检索网站。 下面介绍其中一些基本分析。值得注意的是,在对序列进行分析时,首先应当明确序列的性质,是mRNA序列还是基因组序列?是计算机拼接得到还是经过PCR扩增测序得到?是原核生物还是真核生物?这些决定了分析方法的选择和分析结果的解释。 (一)核酸序列分析 1、双序列比对(pairwise alignment) 双序列比对是指比较两条序列的相似性和寻找相似碱基及氨基酸的对应位置,它是用计算机进行序列分析的强大工具,分为全局比对和局部比对两类,各以Needleman-Wunsch 算法和Smith-Waterman算法为代表。由于这些算法都是启发式(heuristic)的算法,因此并没有最优值。根据比对的需要,选用适当的比对工具,在比对时适当调整空格罚分(gap penalty)和空格延伸罚分(gap extension penalty),以获得更优的比对。 除了利用BLAST、FASTA等局部比对工具进行序列对数据库的搜索外,我们还推荐使用EMBOSS软件包中的Needle软件(http://bioinfo.pbi.nrc.ca:8090/EMBOSS/),和Pairwise BLAST (https://www.360docs.net/doc/b818330901.html,/BLAST/)。以上介绍的这些双序列比对工具的使用都比较简单,一般输入所比较的序列即可。 (1)BLAST和FASTA FASTA(https://www.360docs.net/doc/b818330901.html,/fasta33/)和BLAST (https://www.360docs.net/doc/b818330901.html,/BLAST/)是目前运用较为广泛的相似性搜索工具。这两

相关文档
最新文档