JVM 的内存模型与线程
1.性能何处寻 计算机的CPU比起其他所有的设备,都快得多,所以怎样尽量复用 CPU 的时间片,是压榨计算机性能的目标。多核和并发,使得阿姆达尔定律大显神威,超越摩尔定律成为提升系统性能的金科玉律 - 现在单核计算能力已经无法垂直提升,要水平提升核数来提升整体性能。 2.缓存一致性问题(Cache Coherence) 软件缓存,不过是硬件缓存的模仿,真正的缓存,早已存在于计算机的多级存储体系结构中。JVM 里,我们可以认为每个处理器都会在主内存(Main Memory)之外有高速缓存作为工作内存(Working memory)。除此之外,处理器和 JVM 都可能出现指令重排(Instruction Reorder)的的情况。工作内存是线程 Save 和 Load 的主要场所,主内存则是他们沟通的场所。 3.JVM 的对象信息 Java Object 除了基本的内存轮廓以外,还有: Mark Word(对象的 Hash Code 的缓存值、GC标志、GC年龄、同步锁等信息)。 Klass...
如何把 composer 锚定到 e2e 的复杂网络
下载并进入/blockchain-explorer 项目。 cd fabric-docker-compose-svt。 download_images.sh(不要让 start.sh 代劳,要用特定的版本)。 ./start.sh 建立这个隐藏文件夹 /Users/magicliang/.composer-credentials,如果里面有内容要先清空。 把公私钥导入这个文件夹,注意最后一个 keystore 的私钥可能会变化: 1composer identity import -p explorer -u PeerAdmin -c /Users/magicliang/Desktop/Programming/git/blockchain-explorer-cp/fabric-docker-compose-svt/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem -k...
Cello 在 mac 上需要特别注意的几个问题
/opt/cello 和 /opt/cello2 以及下面的 mongo 和 fabric-1.0 都尽量把 owner 和 group 改成当前用户名和当前用户名组名。然后把这两个子文件夹用 docker file sharing 打开。 docker 会对 cello 下的 file sharing 有很麻烦的冲突影响。解决方法是建立一个 cello2 文件夹,然后在 cello 项目下用以下脚本把 fabric-1.0 的文件夹迁移过去: 1234#!/usr/bin/env bashARTIFACTS_DIR=/opt/cello2sudo cp -r ./src/agent/docker/_compose_files/fabric-1.0 ${ARTIFACTS_DIR}sudo chown -R ${USER}:${USERGROUP} ${ARTIFACTS_DIR} 然后修改 vi .//src/agent/docker/docker_swarm.py,把 ...
Docker 的 Volume
为什么要有数据卷 Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。 换言之,删除容器的时候要记得顺便删除数据卷,例如: 1234# 删除全部容器连带的数据卷docker ps -aq | xargs docker rm -f -v# 删除遗留而不用的容器docker volume prune Volume 必须在容器初始化时就创建,也就意味着,只能在 docker run 或者 Dockerfile 里面指定数据卷。 $ docker run -it —name container-test -h...
以太坊相关研究资料
《以太坊的 gas 费率一览表》 《以太坊学习笔记:私有链搭建操作指南》 《以太坊中的账户、交易、Gas和区块Gas Limit》 StackOverflow 上的问答:以太坊主链到底需要多大空间? StackOverflow 上的问答:怎样提供无限次数的智能合约操作? 《区块链技术-智能合约-以太坊 (译文)》 《以太坊官方文档》 《以太坊私有链搭建指南》 《以太坊关于搭建私有网络的 wiki》 《预充值以太坊资金的方法》。注意看 carchrae 的回复,这里面也提供了拷贝私钥复用私钥的方法,可以考虑在多节点的情况下使用。 《一本与参数有关的介绍怎样搭建私链的 gitbook》。 StackOverflow 上的问答:以太坊的网络难度是否可以静态锁死?注意看它还有个相关的子问题。如果网络算力的稳定的话,应该不会出现难度增长才对。 值得大读特读的 geth 的文档。特别是挖矿、账户管理的部分。 geth 的命令行选项。注意,有些选项在当前版本中已经消失了,如(gpomin、gpomax)。 StackOverflow...
把 Unix 的 Domain Socket 转成可本地访问的 TCP 端口
使用管道命令的做法:1socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX:/var/run/docker.sock 简洁的做法(使用守护进程而不是使用管道命令)1docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock 从容器内往外看的主机,对应外部主机就是 127.0.0.1的端口ping docker.for.mac.localhost 通常结果是192.168.65.1。 值得参考的文: http://brieflyx.me/2015/linux-tools/socat-introduction/
Docker in Docker
官方博客里提供的DinD 的解决方案 在遥远的年代,需要很多其他的东西来辅助生成一个 docker in docker 的例子,但如今一个 —privileged 的 flag 就搞定一切了。 当前版本正确的 DinD 方案,是这样启动一个 DinD 容器: 1docker run --privileged -d docker:dind exec 进入这个容器: 1docker exec -it agitated_curran /bin/sh 然后在容器里再跑一个容器: 1docker run -it ubuntu /bin/bash Docker in Docker 为什么难?这有一篇博客《~jpetazzo/Using Docker-in-Docker for your CI or testing environment? Think twice.》,专门解释这个问题。总体看下来,有方便的地方,但也会让 Linux...
银翼杀手
2049没好人。
JVM 与编译优化
Java 的编译分期,至少可以分为两个阶段(有些情况下还有额外的第三种编译过程): 编译前端(前端编译):把 .java 变成 .class 文件的过程。也就是把源语言文件变成中间语言文件的过程。典型的例子有:javac、Eclipse 的 ECJ的工作过程。 编译后端(后端编译):由 JIT(Just In Time Compiler。我认为应该还要把 Interpreter包括在内)把中间语言(字节码)转换成二进制目标体系结构机器码的过程。典型的例子有,HotSpot 的 C1,C2编译器的工作过程。 AOT(Ahead Of Time) 编译器直接把源代码编译成转换成二进制目标体系结构机器码的过程。 早期(编译)优化 javac 自从1.3版本已经不再支持什么 -O 的优化了。所有的优化策略集中到后端编译里。这样没有经过 javac 编译的 JRuby、Jython程序,也可以享受到 JVM 的优化福利。 javac的编译过程,大致上是: 解析和填充符号表(Parse and...
基于栈的虚拟机
基于栈的虚拟机,可移植性更好。