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

  • SQLView -- 可视化的Weblogic JDBC DEBUG

/Articles

ArrayList的动态数组扩容与收缩

最近在复习线性数据结构的时候,顺便拿了Java的ArrayList做了分析比较。ArrayList的本质是动态数组,当新加如的数据逼近数组容量时,自动扩容,删除数据后,自动收缩。这么做,虽然效率比较低,但是一定程度上能优化内存分配。 自动扩容 ArrayList内部有个elementData的Object数组,初始容量在Java 8中为10。当第11个数据需要添加时候,扩容1.5倍。这个1.5倍在ArrayList很巧妙,用了整数移位的方式。 int newCapacity = oldCapacity + (oldCapacity >> 1); 完整的扩容代码是:...

Linux如何优雅地输出Java线程堆

诊断Java线程问题时,一直要求提供客户Java的线程堆。大部分时间都在指导客户怎么抓数据,非常浪费时间。曾经写了一个非常方便的脚本,但是用户一般都会纠结于参数的选择,效果不明显。 有兴趣的可以使用我的脚本 ajs2.sh #!/bin/bash #-------------------------------------------------------------------------------- #- File name: ajs.sh - (A)uto (J)ava (S)tack #- Purpose: Collect Java Stacks...

JDBC驱动的类加载-SPI新瓶装旧酒

今天偶尔看JDBC驱动的问题,发现了一个有意思的事情,就是Class.forName()和SPI动态注册,原理居然是一样的,新瓶装旧酒。 老派的手工注册 JDBC很早以来一直采用驱动管理显式的注册方法,就是驱动类的使用者,显式地使用Class.forName()加载驱动类。 Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection(...); Class.forName()的作用是初始化具体driver类的用static显式声明的静态初始化块。按照JDBC...

SQLView-用Python将Weblogic JDBC数据可视化

When to run SQLView? If you have any issue of SQL data related, or you have to analyze SQL execution time, then use SQLView. The case could be like: No expected data from Search Duplicated rows returned from Search Potential long running SQL How to run SQLView? Copy SQLView.py to Weblogic...

file命令与magic查询原理

在给客户处理问题时候,用到了file命令,后来对file命令产生了兴趣,所以拿它和Java类文件的魔术判断做实验,这里记下一些实验的收货。 Java Class文件通过魔数来标识自身的编译版本。在Linux中,通过 xxd,可以看到十六进制头部信息。 $ xxd CookieExample.class | head -2 0000000: cafe babe 0000 0034 00ed 0a00 4400 7b08 .......4....D.{. 0000010: 007c 0b00 7d00 7e08 007f 0700 800a 0005 .|..}.~............

一个JDBC未使用连接池导致的数据库INACTIVE SESSOIN

本周有个客户报数据库出现大量的INACTIVE SESSION,数据库无法及时清除,导致超出进程限制,应用的其他请求无法得到响应。整个排错的思路很清晰,记录之。 System parameters with non-default values: processes = 1000 ORA-00020: maximum number of processes (1000) exceeded 排查他们的数据库,进程数提高2000后,发现还是有大量的连接请求持续不断地产生,慢慢逼近2000。 > SELECT DISTINCT username,...

Java异常链与故障诊断

产品的故障诊断,都需要依靠日志文件中的异常栈来判断。很多时候,我不得不需要客户提供真实的数据库,一点点去调试。而客户提供的日志文件,很多时候都没有参考价值。原因就在于我们的代码中,Exception捕获的处理方式太随意,不注重后续跟踪。 Exception处理很容易被程序员忽略,大家都不注重,以为只要抛出来就对了,因为觉得它太简单了,too simple 所以 nobody cares。我把下面例子一讲,就会明白,道理如此简单,作用如此重要。 错误模拟 自定义一个AppException,再派生两个子类。 package cn.xwiz.test.exception; public...

Java加密套件强度限制引起的SSL handshake_failure

今天为客户解决了一个奇葩的SSL问题。通过Java代码使用HttpURLConnection去连接https系统时候总是报错handshake_failure。而使用浏览器访问一切正常。记录下诊断的过程。 HttpURLConnection的调用非常简单。 HttpURLConnection connection = (HttpURLConnection)m_url.openConnection(); connection.setRequestMethod("GET"); connection.setAllowUserInteraction(false);...

Python将CSV转换成HTML表格

我一般用Python处理数据文件,比如分析日志,转换文件等。比如我开发的Oracle内部使用的SQLView工具就是基于Jython/Python,对产生的Weblogic JDBC分析并生成最直接可视的报表。套用现在最装B的说法,就是数据可视化。 SQLView的脚本比较复杂,它需要对不同行进行交叉引用分析。而下面的这个例子,是把一个CSV文件转换成HTML文件。将复杂的数据生成彩色的HTML,老板们最喜欢这种花里胡哨的报表了。...

Java证书安装及多个Java应用间的根证书交叉信任

在一套Java产品环境中,常常会存在不同的Java应用,相互之间会通过HttpClient模拟HTTP访问对方,这时就涉及到浏览器所不会用到的特殊的过程:根证书的交叉信任。最后面会讲为什么浏览器和Java应用服务器的通信不需要交叉导入根证书(公钥)。 制作密钥库文件 假设有2个Java应用, app1和app2,用户访问的地址为https://app1.xwiz.cn 和 https://app2.xwiz.cn。首先分别为这两个主机应用创建密钥库JKS和证书请求CSR keytool -genkey -alias app01 -keyalg RSA -keysize 2048...

可迭代对象的元素的拆包

今天用到了元组一个很实用又很简单的运算,就是元素拆包。其实可以把拆包推广到所有的可迭代对象: list,set, dictiona等,只要这个可迭代对象的值的数量和接收它门的变量数量一致,拆包就能实现自动匹配。 花了点时间,实验了比较多的可能性,把拆包总结了一下。 赋值拆包 这个用在变量的定义赋值语句中,比如下面的三种迭代类型:元组、列表和集合。元素a,b,c按照顺序自动获取每个整型值。 a, b, c = (1, 2, 3) a, b, c = [1, 2, 3] a, b, c = {1, 2, 3}...

容器对象的推导方式和元组生成器表达式

使用推导语法可以快速地产生容器系列的对象,比如list,set,dict,tuple。由此出现了列表推导,集合推导,字典推导和元组推导(生成器表达式) 列表推导 比如一个最简单的列表推导,将逗号分隔的字符串组成列表。 str = '0,1,2,3,4,5,6,7,8,9' list1 = [i for i in str.split(',')] xprint(list1) type:<class 'list'>,id:2486205385608,value:['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']...

1 2 3 4 5 6 7 8 9 10 11