scp 与 软连接
scp的时候,无法做到保留软连接,而总是直接copy软连接的真实内容;
解决办法: 使用 rsync
举例:
1 |
rsync -avuz -e ssh test phpor@172.16.22.41:/tmp/ |
参考: http://www.linuxask.com/questions/how-to-mirror-a-directory-to-a-remote-server-over-ssh
软件可维护性
软件可维护性即维护人员对该软件进行维护的难易程度,具体包括理解、改正、改动和改进该软件的难易程度。
决定可维护性的因素:
1.系统的大小
2.系统的年龄
3.结构合理性
可维护性可通过7个质量特性来衡量:
可理解性
可测试性
可修改性
可靠性
可移植性
可使用性
效率
注意: 没有 可扩展性,可扩展性和可修改性是不同的概念
McCabe度量法_百度百科
nginx 配置点滴
- 重定向
- rewrite可以重定向
- return 301 $url; 也能重定向,简单的重定向使用return 301更简介,如,强制访问443端口,80段定义如下:
123456server {listen 80;server_name phpor.net;return 301 https://$host$request_uri;}
- return 301 $url ; 不同于 return $url ;
- 后者不会导致页面跳转,而是服务器端代为请求了
- location = / 不能嵌套在其他的location中,虽然逻辑上似乎合理,但是执行不到
- nginx中常用的变量: http://nginx.org/en/docs/varindex.html
- lua openresty https://github.com/openresty/lua-nginx-module
关于location:
- location之间是互斥的,可以嵌套,但不可以继承,如:
- location / 嵌套在 location / 中,虽然没有语法错误,但是,内层的location不会被执行到
- location /sub 嵌套在 location / 中时,如果匹配到了location sub 则location / 里面 ,location /sub 外面的逻辑不会被执行到,这就是我所谓的不可以继承,效果等同于并列的两个location
开发库
开发库是开发人员修改代码的地方。(开发人员可以随意修改)
受控库是测试版本代码存放的地方。(需要开发组长提交测试申请修改)
产品库是测试通过版本存放的地方。(需要测试报告来驱动修改)
参考
http://blog.sina.cn/dpool/blog/s/blog_4ec6138401000akg.html?vt=4
开发库 受控库 产品库
开发库是开发人员修改代码的地方。(开发人员可以随意修改)
受控库是测试版本代码存放的地方。(需要开发组长提交测试申请修改)
产品库是测试通过版本存放的地方。(需要测试报告来驱动修改)
java cpu 100% 无响应
占用cpu高的线程的堆栈如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Thread 1 (process 17775): #0 0x00007fa870981179 in Klass::subklass() const () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #1 0x00007fa8706d15c5 in Dependencies::find_finalizable_subclass(Klass*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #2 0x00007fa8705df8ee in ciInstanceKlass::has_finalizable_subclass() () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #3 0x00007fa87052483e in GraphBuilder::call_register_finalizer() () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #4 0x00007fa87052b2a5 in GraphBuilder::method_return(Instruction*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #5 0x00007fa87053185f in GraphBuilder::iterate_bytecodes_for_block(int) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #6 0x00007fa87052ec4b in GraphBuilder::iterate_all_blocks(bool) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #7 0x00007fa87052f5e6 in GraphBuilder::try_inline_full(ciMethod*, bool, Bytecodes::Code, Instruction*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #8 0x00007fa87052f7df in GraphBuilder::try_inline(ciMethod*, bool, Bytecodes::Code, Instruction*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #9 0x00007fa870530912 in GraphBuilder::invoke(Bytecodes::Code) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #10 0x00007fa87053183d in GraphBuilder::iterate_bytecodes_for_block(int) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #11 0x00007fa87052ec4b in GraphBuilder::iterate_all_blocks(bool) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #12 0x00007fa87052f5e6 in GraphBuilder::try_inline_full(ciMethod*, bool, Bytecodes::Code, Instruction*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #13 0x00007fa87052f7df in GraphBuilder::try_inline(ciMethod*, bool, Bytecodes::Code, Instruction*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #14 0x00007fa870530912 in GraphBuilder::invoke(Bytecodes::Code) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #15 0x00007fa87053183d in GraphBuilder::iterate_bytecodes_for_block(int) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #16 0x00007fa87052ebf2 in GraphBuilder::iterate_all_blocks(bool) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #17 0x00007fa8705337a7 in GraphBuilder::GraphBuilder(Compilation*, IRScope*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #18 0x00007fa87053c127 in IRScope::IRScope(Compilation*, IRScope*, int, ciMethod*, int, bool) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #19 0x00007fa87053c23f in IR::IR(Compilation*, ciMethod*, int) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #20 0x00007fa87051b25b in Compilation::build_hir() () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #21 0x00007fa87051b61e in Compilation::compile_java_method() () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #22 0x00007fa87051b74e in Compilation::compile_method() () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #23 0x00007fa87051babe in Compilation::Compilation(AbstractCompiler*, ciEnv*, ciMethod*, int, BufferBlob*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #24 0x00007fa87051c869 in Compiler::compile_method(ciEnv*, ciMethod*, int) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #25 0x00007fa87066f43a in CompileBroker::invoke_compiler_on_method(CompileTask*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #26 0x00007fa8706703e6 in CompileBroker::compiler_thread_loop() () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #27 0x00007fa870c2386f in JavaThread::thread_main_inner() () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #28 0x00007fa870c2399c in JavaThread::run() () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #29 0x00007fa870ad7de8 in java_start(Thread*) () from /usr/java/jdk1.8.0_45/jre/lib/amd64/server/libjvm.so #30 0x0000003202c079d1 in start_thread () from /lib64/libpthread.so.0 #31 0x00000032028e88fd in clone () from /lib64/libc.so.6 |
gdb 跟进发现:线程在函数Dependencies::find_finalizable_subclass(Klass*) 中,应该有一个循环,不断地调用函数Klass::subklass()
解决办法:
The fix was simple – disable CMS class unloading options when -Xnoclassgc or -XX:-ClassUnloading are specified.
参考资料:
https://blogs.oracle.com/poonam/entry/jvm_hang_with_cms_collector
想阅读jvm源码吗? https://blogs.oracle.com/sundararajan/entry/so_you_want_to_read