• DAnalyzer 1.2发布啦 -- Weblogic与Directory协议分析工具

  • SQLView -- 可视化的Weblogic JDBC DEBUG

/Articles

类变量与实例变量的内存存储

变量有类变量、实例变量和局部变量。局部变量比较好区别。类变量与实例变量的区别就在于前者在类中被定义时有static修饰符。 类变量属于类级别,因此在多个线程中引用时是共享的,因此只存在于一个内存区域。而实例变量仅仅属于类定义的具体实例,多个实例之间不共享实例变量,因此他们使用不同的内存地址。 这里就出现了一个问题。实例都是类的具体定义,都是保存在heap堆中,因为堆都是保存具体的对象,所以实例变量也一定会保存在heap堆中。heap堆中因此一定不会存储类变量,因为类变量不属于任何对象。废话那么多,那类变量储存在哪个内存区域呢? 通过具体的例子来看看就明白了。 package...

String对象常量池和内存分配

创建String变量的时候,对象的产生和内存分配会因为创建方式不同而有显著的差别。 直接赋值 String a1 = "hello"; String a2 = "hello"; String a3 = "hello"; System.out.println("a1=a2?" + (a1==a2)); System.out.println("a1=a3?" + (a1==a3));...

Tomcat Service在Windows上的JVM参数位置

Tomcat如果以命令行的方式启动,JVM以及程序参数的设置非常简单,只要修改命令文件中的参数就可以了。偶尔接触到Tomcat在Windows上以Service的形式启动,找到JVM设置的位置,花了不少的冤枉时间,因为Tomcat文档几乎没有提到。 JVM以及程序参数 Tomcat被注册为Service之后,相应的所有启动参数全部写到注册表中,具体的路径就是: HKEY_LOCAL_MACHINE |_____________SOFTWARE |______Wow6432Node...

抛弃ObjectOutputStream用JSON处理Java对象串行化

前面提到了Java推荐的串行化ObjectInputStream/ObjectOutputStream 缺点比较明显(生成的数据大;人和其他语言无法阅读),所以已经不再适用了。相反的,JSON或者XML格式处理串行化已经是主流,优点自然显而易见: 数据小,快速传输 人能直接阅读,各语言都能解析 可以构造字符串,反串行化生成实例对象 这里举个Google的开源Gson,用于将Java对象JSON化。 JSON格式的串行与反串行 public class Employee implements Serializable { private static final long...

Java IO - PipedInputStream和PipedOutputStream的多线程读写

PipedInputStream和PipedOutputStream通过pipe使得同一个JVM进程中的不同线程下的两个输入输出流可以交换数据。Pipe流设计时有下面的限制。 输入流不能比输出流先关闭 输入流必须完整无缺地读到全部的输出流数据,不能只读一部分 输出流和输出流必须显式地调用close()关闭 PipedInputStream的读处于阻塞状态,即等待PipedOutputStream写出数据后才能写入...

Java IO - PushbackInputStream判断Class文件有效性

PushbackInputStream可以让程序试探性地读取字节流的前若干个字节来判断是否该流是自己期望的。如果是,可以处理后续流数据。如果不是,可以回退读取的字节,把流交给其他人。 这个例子演示一个简单的场景,读取Java Class文件,判断是否是合法的Class 魔数是否为合法的"CAFEBABE" Major Version是否是期望的版本 首先查阅Java规范,可以知道Class的文件结构为: ClassFile { u4 magic; u2 minor_version; u2 major_version; u2...

Java IO - ObjectOutputStream串行化二进制数据分析

ObjectOutputStream和ObjectInputStream配对使用来处理实现了Serializable接口的对象。Serializable,串行化,这种计算机专用术语太过于拗口,如果按照我自己的解释,说得最通俗一点就是把对象里面各个需要写出的数据按照事先设计好的的规则和格式排列,组成一个二进制的数据行,写出到目标地。目标地再按照一定的格式把数据解析出来,还原成原始的对象。 串行化二进制文件格式分析 Java对于如何设计这个规则,有专门的文档(Object Serialization Stream Protocol)解释写出的数据的二进制各个标段的含义。...

Java IO - DataOutputStream/DataInputStream处理中文

DataOutputStream、DataInputStream可以将Java中的基本类型以类似对象的方式存储或读取,不再以字节方式处理,方法非常简单。但在处理中文字符时,存储方式就比较特殊。 基本类型的定长读写 Java基本类型都是定长的,也就是每个基本类型通过DataInputStream写入文件时,都是定长地写。在DataInputStream读取时不需要程序员考虑下一个类型从何处开始何处结束。比如整型为32位4字节长,浮点型为32位4字节长,boolean型非常特殊,有效值只是1个bit(0或1),size在官方JVM规范中也没有明确讲明,但在例子中可以看到它占用8位1个字节。...

Java IO - ByteArray流的重用

ByteArrayInputSteam类将内存中的字节数组作为数据源,利用这个特性,可以通过ByteArrayInputSteam重用一些需要特殊处理、或者重复使用的字节数组或大字符串,比如XML格式的内容。 一个有用的场景是对于异常的特殊处理。一般而言,我们简单地通过 Exception.printStackTrace()方法直接输出异常栈到标准输出stdout。 异常的一般性处理 try { int x = 1 / 0; // <--- } catch (Exception e) { e.printStackTrace(); }...

Java IO - FilterInputStreadm/FilterOutStream使用场景

FilterInputStream和FilterOutputStream的使用场景比较少,但是提供了一个可扩展的流处理的可能性,它采用了装饰者设计模式,FilterInputStream是所有具体装饰者的父类,内部包裹一个InputSteam的原始类作为被装饰对象,通过具体的FilterInputStream的子类实现来调用InputStream的流处理功能,并在流基础上附加额外的功能。 比如前面提到的BufferedInputStream,它就是装饰者子类实现,文件流的读取依然调用父类FilterInputStream所包裹的InputStream,但额外提供了内部buf的缓存功能。...

Java IO - 用SequenceInputStream合并文件

通过SequenceInputStream可以连接多个InputStream对象,按照排列顺序依次读取各个InputStream中的数据。这个特点很容易想到一个非常常见的场景,就是文件合并。下面的例子简单演示一个文件的拆分和合并的过程。 文件拆分 split函数根据指定的size参数,将文件拆分成每个size大小的小文件。按照 .1、 .2、 .3的顺序命名各个文件。 public static void split(String filename, int size){ try{ FileInputStream in = new...

Java IO - 带Buffer的文件二进制读写及问题

一般性文件的顺序读写提供的函数或者一个字节/字符地读写,或者以字节/字符数组的方式一次性读入一定数量的数据进入数组。后者其实相当于一个缓存。但JDK又额外提供了BufferedInputStream和BufferedOutputStream。他们的处理方式非常简单。 看个例子 String srcFile = "./test/qq.exe"; String destFile = "/test/qq2.exe"; try (BufferedInputStream bis = new BufferedInputStream(new...

1 2 3 4 5 6 7 8 9 10 11