0%

起因

一方面是原来的vps速度确实不太行,另一方面是我现在在用的ipv4基本天天早上都炸裂,打开百度开了我30秒实在是没办法办公,就想到了用ipv6vps来做代理,但是这速度也不太行,今天终于痛下杀心决定好好搞一波,为了能够愉快上油管看视频,冲啊。

阅读全文 »

虽然随着同步软件用的越来越多,ftp基本没怎么用到了,但是我觉得还是有必要复习一下。

FTP的目的

首先FTP存在的目的主要是为了解决两台不同主机传输文件的问题,这两台主机可以运行不同的操作系统、拥有不同的文件结构,甚至连字符集都可以不一样。

FTP细节

首先这个协议需要使用两个TCP链接来传输一个文件。

1) 客户端服务器会打开21端口。客户端也会使用21端口来建立连接。在IP包中,服务类型是“最大限度地减小延时”

2) 传输一个文件就需要打开一个数据连接,所以底下的ip包是“最大限度提高吞吐量”

文件类型

​ (a)ASCII码文件。利用NVT ASCII码的形式传输,NVT ASCII代表7位的ASCII字符集,网间协议族都使用NVT ASCII ,每个7位的字符都以8位格式发送,最高位为0,且每行都有一个回车,而后是一个换行。

​ (b) EBCDIC文件。要求两边都是EBCDIC文件,但是我从来没见过这种文件。

​ (c)图像文件类型,用二进制比特流进行传输。

前言

本篇论文翻译自2018 IEEE Symposium on Security and Privacy (S&P)的《FP-STALKER:Tracking Browser Fingerprint Evolutions》

简单翻译了一下。缺少精校。

阅读全文 »

问题产生

在使用Xshell连接远端服务器的时候,在进行一些操作的时候,Xshell会在命令行中疯狂输出自己,就像这样:

image-20200107102634302

这个时候八成你的屏幕上面是有一堆乱码的。之前也没一直去理解为什么会这样,现在有空来分析一下这个问题出现的原因和解决办法。

阅读全文 »

高性能硬件部署策略

一台高性能的服务器,指定了java堆的大小为12G,用来作为网站。但是发现效果不理想,因为代码编写的较差,所以很多大文档序列化后的对象一直存在于堆中,而文件的序列化后的对象肯定特别大,所以直接放到老年代里面,导致full GC频繁出现,而一次full GC`需要消耗大概10s的时间,这对一个网站来说是不太适合的。

由于这里讲的是虚拟机的问题,所以暂且先把程序写的差这个问题扔到一边,想想看怎么从虚拟机入手解决这个问题。首先我们需要知道,full GC是必不可少的,但是网站来说大内存肯定也是必要的,也就是一次full GC肯定要花不少时间。那么怎么办呢?降低GC的频率,这样我可以每天在深夜的时候GC或者说干脆一周一次,这样效率就会好的多。但是之前也说了,这是因为代码编写的问题,所以这个方法其实对于这个案例不太好。

最后采用的方法是:部署多个32位的JDK逻辑集群,每个进程是2G内存,然后分配给堆1.5G,并且搭建一个Apache服务来作为前端的均衡器。这样就不会导致发生GC的时候等待时间过长。

简单理解集群:你把你的服务器完完全全复制多份,这样它们就构成了一个集群。

集群同步导致内存溢出

一开始共享数据使用的是数据库,但是读写竞争很激烈,性能不佳。之后用了JBossCache做了一个全局缓存(JBoss Cache是针对Java应用的企业级集群解决方案,其目的是通过缓存需要频繁访问的Java对象,提高应用的可用性并大幅度提升应用的整体性能),但是出现了内存溢出的问题。所以让服务带着记录日志的选项运行了一段时间,然后发生了溢出,分析了heapdump文件,发现其中存在了大量的org.jgroups.protocols.pbcast.NAKACK的对象,这主要是因为信息可能会发送失败,所以需要在所有节点都收到正确的信息前,把发送的信息放在内存里面,这就导致出现了这个问题。

这个问题是因为网络连接不通畅,导致数据需要重发,重发的数据在内存中不断堆积,就产生了内存溢出。

使用外部命令导致CPU占用高

java可以执行shell的命令,通过Runtime.getRuntime().exec()即可,但是JVM是通过克隆一个和自己一模一样的进程,然后让这个进程去执行外部的命令,最后再推出这个进程。显然如果频繁执行外部的命令,那样系统的压力会很大,所以少用这个命令,而是使用java的API去实现。

其它的一些案例

有一些事因为外部的接口出错导致的问题,只需要修复外部接口响应过慢即可。

有一个是因为数据结构不对,Map<Long, Long>耗费了太多资源。

有一个是java swing的问题,现在早就没人用java写桌面程序了,跳过。

还有一个是因为循环的时候,到安全点时间过长导致的停顿。这个很有意思,默认是用int作为索引的循环不会建立安全点,而使用long作为索引的循环会建立安全点。

IDEA调优实例

书中是eclipse,我用的是IDEA,所以我仿照书中的方法对我的idea进行了优化。

我的设备是mac book pro 2018乞丐版,内存16G。

idea打开Help - edit custom VM options就可以方便的进行虚拟机参数调整了。

  1. 通过让jvm运行于服务器模式。
  2. 升级JDK版本
  3. 设置好永久代的大小(这里已经废了)
  4. 取消字节码验证,可选
  5. 调整堆大小
  6. 屏蔽掉系统的gc
  7. 更换对应的垃圾收集器

最后对应的参数调整为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-Xms4g
-Xmx4g
-Xmn1g
-XX:PermSize=768m
-XX:MaxPermSize=768m
-XX:ReservedCodeCacheSize=1024m
-XX:+CMSParallelRemarkEnabled
-XX:+CMSClassUnloadingEnabled
-XX:+UseCompressedOops
-Dfile.encoding=UTF-8
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof
-Dide.no.platform.update=true
-Dsun.io.useCanonPrefixCache=false
-Djdk.attach.allowAttachSelf=true
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true
-XX:CICompilerCount=2

编写java我们一般只会用到javacjava这两个命令,最多还会使用javadoc这个,但是实际上JDK里面包含了非常多有用的工具,这里打算介绍几种。

阅读全文 »

本博文对应《深入理解java虚拟机》第三章第三部分。

内存管理无非就是两件事——分配内存和回收内存,之前已经有讲述了垃圾回收机制,但是其实没有讲述一个对象在内存里是怎么分配的。

优先在Eden区

在没有读这本书之前,我一直以为是所有的对象都会直接分配到新生代的Eden区里。实际上是绝大部分的对象会被分配到这里,当这里没有足够的空间的时候,虚拟机就会触发一次Minor GC(次要垃圾回收)。示例代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class testAllocation {
public static final int MB = 1024 * 1024;

public testAllocation() {
byte[] a1, a2, a3, a4;
a1 = new byte[2 * MB];
a2 = new byte[2 * MB];
a3 = new byte[2 * MB];
a4 = new byte[4 * MB];
}

public static void main(String[] args) {
new testAllocation();
}
}

这段代码很简单,就是先后分配了2MB的空间给3个对象,然后最后一个对象分配到了4MB的空间。

阅读全文 »

本博文对应《深入理解java虚拟机》第三章的第二部分

垃圾收集器

之前讲述了几种常见的java垃圾回收算法,只有算法显然是不行的,还需要具体的实现。这里介绍几种垃圾收集器的实现——三个新生代的垃圾收集器,三个老年代的垃圾收集器和一个全能的垃圾收集器G1。

Serial收集器

Serial意为“序列”之意,它是一个单线程的新生代区垃圾收集器。在它工作的时候,会停止所有的线程,直到它垃圾回收完毕。显然从用户的角度来说,这是不能接受的,好好运行的程序为什么非要停下来等待垃圾处理呢,但是没办法,直到目前人们也只是能缩短这个时间,而不能完全消除这个时间。Serial收集器虽然简单,但是它很简单高效,所以它仍然是client模式下非常好的一个选择(也是默认选择)。

该收集器对新生代采用标记-复制算法,而对老年代采用标记-整理算法,不过我们并不会让它去搜集老年代就是了…

阅读全文 »

windows10

win+R,输入shell:startup,会打开一个文件夹。然后把你需要的程序扔进这个文件夹里,这样就会开机启动了。

PS:你的程序可以通过win+R 然后输入shell:appsfolder查看。

如果你用这种方式设置了某个程序开机自启动,当不想的时候直接在文件夹中删除即可。

windows官网推荐是通过设置-应用-启动那栏进行设置,但是我发现那里面只有一点程序。

阅读全文 »

前言

一个项目需要处理比较大量的Excel数据,正好找了个教程学习一下,顺便就当是记录+翻译了。

原始网址:https://www.dataquest.io/blog/excel-and-pandas/

阅读全文 »