JVM 网络连接设置的一些属性

  1. java.net.preferIPv4Stack (default: false) 有 IPv6 就用 IPv6;
  2. java.net.preferIPv6Addresses (default: false) 为了向前兼容性;
  3. networkaddress.cache.ttl 缓存成功的 lookup 多少秒. -1=永远缓存. 若security manager被安装,则永远缓存, 若没安装, 则缓存固定时间;
  4. networkaddress.cache.negative.ttl (default: 10) 失败的 lookup 会缓存多少秒. 0=不缓存, -1=永远缓存;
  5. http.agent (default: Java1.4.0) 当发出 http request 的时候,在 header 中显示的 agent;
  6. http.keepAlive (default: true) 是否使用 http 持久连接;
  7. http.maxConnections (default: 5) 同一地址, 在 keep-live 情况下,保持多少 idle 的连接数;
    其他:
    http.proxyHost (default: )
    http.proxyPort (default: 80 if http.proxyHost specified)
    http.nonProxyHosts (default:

ftp.proxyHost (default: )
ftp.proxyPort (default: 80 if ftp.proxyHost specified)
ftp.nonProxyHosts (default: )

官方解释在这里: https://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html

window 安装可执行文件为系统服务

  1. 首先下载WinSW.NET2.exe
  2. 下载后重命名它为 MyServiceName.exe;
  3. 新建一个文件名为 MyServiceName.xml 文件, 与MyServiceName.exe 同一个目录, 类似如下:

    olapScrubber
    olapScrubber
    olapScrubber
    C:\sre\run.bat
    c:\sre\logs</logpath>
    roll

    更多配置 参考这里: https://github.com/kohsuke/winsw/blob/master/doc/xmlConfigFile.md
  4. 执行 MyServiceName.exe install 就安装好了.

如何删除:
sc delete MyServiceName.exe
参考这里:
https://stackoverflow.com/questions/10061191/add-nginx-exe-as-windows-system-service-like-apache

使用 certutil 编码和编码二进制文件

certutil 是 windows 自带的工具:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil

二进制不方便 copy, 使用 certutil 你可以转换二进制位打印字符, 之后你就可以 copy 了.
远程桌面的时候, 使用剪贴板 copy 就行.

先转成文本
D:\softwares>certutil -encode WinSW.NET2.exe WinSW.NET2.txt
再转回来.
D:\softwares>certutil -decode WinSW.NET2.txt WinSW.NET2.exe

about SSL, TLS some links

分析一个证书的详细内容, 接受的加密算法
https://www.ssllabs.com/ssltest/analyze.html?d=sourceforge.net
如何 debug SSL
https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/ReadDebug.html
关于 jdk 支持的 SSL, TLS 版本
https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https

https://www.ibm.com/support/knowledgecenter/en/SSYKE2_7.0.0/com.ibm.java.security.component.70.doc/security-component/jsse2Docs/ciphersuites.html

https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-httpshttps://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks

https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#ciphersuites

https://confluence.atlassian.com/stashkb/list-ciphers-used-by-jvm-679609085.html

关于 JVM 回收中 跨代之间的引用 card marking, dirty card, write barrier

JVM GC 回收对象的时候, 都是先找出 Root 对象, 然后按照引用关系作出引用关系图, 得到live 对象, 剩下的都是 dead 对象, 继而回收掉这些 dead 对象.

分代回收的时候, 先回收年轻代, 为什么回收年轻代那么快? 仅仅因为年轻代比较小吗? 回收年轻代的时候, 要扫描所有的老年代对象吗? 这里就涉及到 dirty card.
年轻代回收的时候, 首先找出 root 对象, 然后对于从老年代到年轻代的引用, 可以有下面几种方式来发现老年代到年轻代的引用:

  1. 从 root 对象开始找到从老年代到年轻代的引用关系 - 比较耗时, 相当于整个 heap 都做引用关系图;
  2. 忽略 root 对象, 扫描所有老年代对象, 然后找到从老年代到年轻代的引用 - 也挺多的.

openJDK 采用的是上面第二种方式的一个变种. 对老年代 heap 设立一个 dirty card 表. 例如对老年代每256K 映射到 dirty card 中的一个 bit, 如果老年代有对年轻代的引用的时候(老年代对象字段值的修改), 把这个 bit 修改代表 dirty.

一个过程如下:
假如刚做完一次 full GC, 年轻代都是空的, 那么如下:

  1. 如果有新分配对象, 它一定在年轻代, 如果有老年代对象指向这个新对象(字段赋值), 那么这个老年代对象所对应内存的对应
    dirty card bit 被修改为 dirty;
  2. 等到 minor GC 发生的时候, GC 把老年代 dirty card 里面 dirty bit 对应的内存部分的老年代对象和加入到 root 里面, 就可以了. 这样避免了扫描全部. 一旦年轻代 mark 阶段结束, 整个 dirty card 全部恢复为空;
  3. 一旦年轻代开始从 eden 和 from survival copy 到 to survival 或者 promote 部分对象到老年代, 那么 dirty card 的 dirty bit 就开始工作了. 有指针引用的就会变成 dirty bit;

同时年轻代比较小, 所以一次能容纳的对象比较少, 所以 dirty card 里面 dirty bit 不会太多.

随便摘要, 更详细信息可以从这里看:
https://www.ibm.com/developerworks/library/j-jtp11253/http://blog.ragozin.info/2011/06/understanding-gc-pauses-in-jvm-hotspots.html