HeapByteBuffer和DirectByteBuffer
文章首发于:clawhub.club
最近在用java操作LMDB,看看能不能代替BDB实现本地持久化队列的功能,碰到了HeapByteBuffer与DirectByteBuffer的坑。
HeapByteBuffer内容维护在JVM中,容易做到垃圾回收,但是也容易被垃圾回收所影响,在flush到远程的时候,会先拷贝数据到直接内存,再发送。
DirectByteBuffer其数据分配到堆外内存中,所以很多框架都会选择它进行网路交互。避免了数据的额外拷贝,也不会收到垃圾回收的影响。
应用场景DirectByteBuffer适用于频繁的native IO操作,高吞吐量,低延迟。HeapByteBuffer适用于数据量小,方便垃圾回收的场景。
mongoDB迭代数据-springboot版本
文章首发于:clawhub.club
SpringBoot 2.0.1.RELEASE JDK 1.8
MongoDB依赖
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
核心代码1234567//获取集合name内所有的数据MongoCursor<BasicDBObject> iterator = mongoTemplate.getCollection(name).find(BasicDBObject.class).iterator();BasicDBObject object;while (iterator.hasNext()) { object = iterator.next(); //Do something ...
unzip遇到的一些事儿
文章首发于:clawhub.club
背景3个Tb的数据,每个压缩包一个Gb,SSD4T,现要求全部解压。
策略解压后立即删除原有zip包,以防止空间不足。
尝试一 linux shell脚本实现遇到的问题unzip命令会另外fork出线程去执行解压缩,以至于我捕捉不到解压是否完成,会出现还没等解压的时候,rm命令先执行,从而删除zip包,程序报错。
解决办法查资料,问大神,折腾半天,最后转变思路,用JAVA实现。
尝试二 java实现commons-compress
问题一 文件名中文乱码。发现默认的是UTF8编码,尝试了多个编码方式,我一直以为GBK与GB2312是一样的,所以只试了GBK,后来同事帮助下,GB2312完美解决。
问题二 windows与linux对于文件名称限制问题。因为我是在window系统上跑程序,报错:java.nio.file.InvalidPathException: Illegal char <*>
Windows 中文件命名规则
文件名或文件夹名可以由1~256个西文字符或128个汉字(包括空格)组成,不能多于256个字符。文件名可 ...
JAVA CPU占用过高问题排查(linux)
文章首发于:clawhub.club
一 linux查看进程信息1top
二 查看进程占用cpu最多的线程12ps -mp 23967 -o THREAD,tid,time
三 线程ID转16进制12printf "%x\n" 23968
四 查看线程信息12jstack 23967 |grep -A 10 5da0
12jstack 23967 |grep 5da0 -A 30
五 查看进程的对象信息12jmap -histo:live 23967 | more
六 查看进程的GC情况12jstat -gcutil 23967 1000 100
Java中的自动拆箱装箱,包装类中的缓存,类型之间的转化例子
文章首发于:clawhub.club
12345678910111213141516171819202122232425public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; Long g = 3L; Long h = 2L; // Integer 内部-128 到 127 之间数字的缓存机制 System.out.println(c == d); //true // 超出了Integer 内部缓存机制 System.out.println(e == f);//false // a+b 值为基本类型,基本类型和包装类型==比较, // 包装类型会自动拆箱,成为基本类型 ...
Java中的Byte类型的取值范围为啥是-128到127
文章首发于:clawhub.club
基本概念机器数:一个数在计算机中表示叫机器数,带有符号位,正数为0,负数为1。 如:00000011 和 10000011
真值:带符号位的机器数的真正数值叫做机器数的真值。如: 0000 0001的真值 = +000 0001 = +1 ;1000 0001的真值 = –000 0001 = –1
原码:第一位是符号位,其余位数值。 如:+1的原码 = 0000 0001 ; -1的原码 = 1000 0001
反码:正数的反码使其本身,负数的反码是符号位不变,其余各位取反。
如:00000001的反码 = 00000001 ;10000001的反码 = 11111110
补码:正数的补码就是其本身,负数的补码是其反码+1。 如:00000001的补码 = 00000001 ;10000001的补码 = 11111111
+0与-0+0:原码 反码 补码 都是0000 0000
-0:原码:1000 0000 ;反码:111 ...
JDK8接口的默认方法与静态方法-接口与抽象类的区别
文章首发于:clawhub.club
引入JDK1.8后,接口允许定义默认方法与静态方法,如:Iterable类中的foreach方法。
123456789101112131415161718192021222324252627282930313233343536public interface Iterable<T> { /** * Returns an iterator over elements of type {@code T}. * * @return an Iterator. */ Iterator<T> iterator(); /** * Performs the given action for each element of the {@code Iterable} * until all elements have been processed or the action throws an * exceptio ...
数组的常用算法-冒泡排序-选择排序-插入排序-折半查找-数组逆序(java实现)
文章首发于:clawhub.club
冒泡排序
1234567891011121314151617181920/** * 冒泡排序的基本思想是对比相邻的元素值, * 如果满足条件就交换元素值, * 把较小的元素值移到数组前面, * 大的元素值移到数组后面, * 这样较小的元素就像气泡一样从底部上升到顶部。 * * @param array the array */ private static void bubbleSort(int[] array) { for (int i = 0; i < array.length; i++) { for (int j = 1; j < array.length; j++) { if (array[i] > array[j]) { int temp = array[i]; array[i] = array ...
java的几种图片压缩方式:ImageIO、GraphicsMagick、OpenCV、Thumbnails简单介绍
文章首发于:clawhub.club
ImageIO:
JDK自带的图片处理类,处理的质量还不错,但是网上都说会发生OOM。
例子:
1234567891011121314151617181920/** * 按照固定宽高原图压缩 * * @param img 源图片文件 * @param width 宽 * @param height 高 * @param out 输出流 * @throws IOException the io exception */public static void thumbnail(File img, int width, int height, OutputStream out) throws IOException { BufferedImage bufferedImage = ImageIO.read(img); Image image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH); BufferedImage t ...
java通过jnr-ffi调用C++外部函数
文章首发于:clawhub.club
前一阵子碰到个需求,将图片压缩到指定大小(byte),封装成外部服务,期间找过好多方案,最后选用c++操作opencv处理图片,springboot封装成服务。
其中java调用native方法选用了jnr-ffi。这个工具是在以前用lmdb的时候发现的。jnr的github地址使用基本上看他的README就可以了。
记一下注意的地方:
1、类型对应String - equivalent to const char *StringBuffer - equivalent to char *
2、注解@out:可以减少一次数据拷贝,详细信息去看源码。1int test(@Out ByteBuffer byte, int size);