- 浏览: 2597522 次
- 来自: 杭州
文章分类
- 全部博客 (1190)
- webwork (4)
- 网摘 (18)
- java (104)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (15)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (8)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
Aqu415:
,默认是netty还是hassion?
dubbo入门 -
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介
jython30个并发性能下降比较明显,有超时现象:
<urlopen error timed out> /napi/blog/detail/?blog_id=45756664
cost:2.00654006004
cost:1.49004387856
cost:0.0366380214691
cost:1.3818898201
cost:1.11271309853
cost:0.0867030620575
cost:0.51217007637
<urlopen error timed out> /napi/blog/detail/?blog_id=45705708
jstack看了一下大量被IdImpl.id()BLOCKED了
"catalina-exec-111" daemon prio=10 tid=0x00002aaac0844000 nid=0x1a91 waiting for monitor entry [0x0000000052436000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.python.core.IdImpl.id(IdImpl.java:76)
- waiting to lock <0x0000000704407ec8> (a org.python.core.IdImpl)
at org.python.core.Py.id(Py.java:1830)
at org.python.core.__builtin__.id(__builtin__.java:667)
at org.python.core.BuiltinFunctions.__call__(__builtin__.java:82)
at org.python.core.PyObject.__call__(PyObject.java:407)
at copy$py._keep_alive$13(/data1/duitang/dist/sys/jython/Lib/copy.py:281)
at copy$py.call_function(/data1/duitang/dist/sys/jython/Lib/copy.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:149)
at org.python.core.PyFunction.__call__(PyFunction.java:357)
at copy$py.deepcopy$7(/data1/duitang/dist/sys/jython/Lib/copy.py:194)
at copy$py.call_function(/data1/duitang/dist/sys/jython/Lib/copy.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyFunction.function___call__(PyFunction.java:406)
at org.python.core.PyFunction.__call__(PyFunction.java:401)
at django.db.models.sql.query$py.clone$18(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/sql/query.py:291)
at django.db.models.sql.query$py.call_function(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/sql/query.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:127)
at org.python.core.PyFunction.__call__(PyFunction.java:347)
at org.python.core.PyMethod.__call__(PyMethod.java:109)
at django.db.models.query$py._clone$47(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/query.py:762)
at django.db.models.query$py.call_function(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/query.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:127)
at org.python.core.PyFunction.__call__(PyFunction.java:347)
看了jython的实现大概明白了,他自己实现了一个WeakIdentityMap用来做cache,但不是线程安全,就粗暴的在 public synchronized long id(PyObject o)方法前面直接加上 synchronized。
看了大概明白了,他自己实现了一个WeakIdentityMap用来做cache,但不是线程安全,就粗暴的在方法前面直接加上 synchronized。
这是他自己实现的WeakIdentityMap:
引用
<urlopen error timed out> /napi/blog/detail/?blog_id=45756664
cost:2.00654006004
cost:1.49004387856
cost:0.0366380214691
cost:1.3818898201
cost:1.11271309853
cost:0.0867030620575
cost:0.51217007637
<urlopen error timed out> /napi/blog/detail/?blog_id=45705708
jstack看了一下大量被IdImpl.id()BLOCKED了
引用
"catalina-exec-111" daemon prio=10 tid=0x00002aaac0844000 nid=0x1a91 waiting for monitor entry [0x0000000052436000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.python.core.IdImpl.id(IdImpl.java:76)
- waiting to lock <0x0000000704407ec8> (a org.python.core.IdImpl)
at org.python.core.Py.id(Py.java:1830)
at org.python.core.__builtin__.id(__builtin__.java:667)
at org.python.core.BuiltinFunctions.__call__(__builtin__.java:82)
at org.python.core.PyObject.__call__(PyObject.java:407)
at copy$py._keep_alive$13(/data1/duitang/dist/sys/jython/Lib/copy.py:281)
at copy$py.call_function(/data1/duitang/dist/sys/jython/Lib/copy.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:149)
at org.python.core.PyFunction.__call__(PyFunction.java:357)
at copy$py.deepcopy$7(/data1/duitang/dist/sys/jython/Lib/copy.py:194)
at copy$py.call_function(/data1/duitang/dist/sys/jython/Lib/copy.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyFunction.function___call__(PyFunction.java:406)
at org.python.core.PyFunction.__call__(PyFunction.java:401)
at django.db.models.sql.query$py.clone$18(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/sql/query.py:291)
at django.db.models.sql.query$py.call_function(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/sql/query.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:127)
at org.python.core.PyFunction.__call__(PyFunction.java:347)
at org.python.core.PyMethod.__call__(PyMethod.java:109)
at django.db.models.query$py._clone$47(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/query.py:762)
at django.db.models.query$py.call_function(/duitang/dist/sys/tomcat/webapps/ROOT/WEB-INF/lib-python/Lib/site-packages/django/db/models/query.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:127)
at org.python.core.PyFunction.__call__(PyFunction.java:347)
看了jython的实现大概明白了,他自己实现了一个WeakIdentityMap用来做cache,但不是线程安全,就粗暴的在 public synchronized long id(PyObject o)方法前面直接加上 synchronized。
package org.python.core; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.Map; import org.python.util.Generic; public class IdImpl { private WeakIdentityMap idMap = new WeakIdentityMap(); private long sequentialId; public synchronized long id(PyObject o) { Object javaProxy = o.getJavaProxy(); if (javaProxy != null) { return java_obj_id(javaProxy); } else { return java_obj_id(o); } } public String idstr(PyObject o) { return String.format("0x%x", id(o)); } public synchronized long java_obj_id(Object o) { Long cand = (Long)idMap.get(o); if (cand == null) { long new_id = ++sequentialId; idMap.put(o, new_id); return new_id; } return cand.longValue(); } }
看了大概明白了,他自己实现了一个WeakIdentityMap用来做cache,但不是线程安全,就粗暴的在方法前面直接加上 synchronized。
这是他自己实现的WeakIdentityMap:
public static class WeakIdentityMap { private transient ReferenceQueue<Object> idKeys = new ReferenceQueue<Object>(); private Map<WeakIdKey, Object> objHashcodeToPyId = Generic.map(); @SuppressWarnings("element-type-mismatch") private void cleanup() { Object k; while ((k = idKeys.poll()) != null) { objHashcodeToPyId.remove(k); } } private class WeakIdKey extends WeakReference<Object> { private final int hashcode; WeakIdKey(Object obj) { super(obj, idKeys); hashcode = System.identityHashCode(obj); } @Override public int hashCode() { return hashcode; } @Override public boolean equals(Object other) { Object obj = get(); if (obj != null) { return obj == ((WeakIdKey)other).get(); } else { return this == other; } } } // Used by test_jy_internals public int _internal_map_size() { return objHashcodeToPyId.size(); } public void put(Object key, Object val) { cleanup(); objHashcodeToPyId.put(new WeakIdKey(key), val); } public Object get(Object key) { cleanup(); return objHashcodeToPyId.get(new WeakIdKey(key)); } public void remove(Object key) { cleanup(); objHashcodeToPyId.remove(new WeakIdKey(key)); } }
相关推荐
它包含一个记录Jython测试脚本的HTTP代理,一个用于回放测试的命令行实用程序。代理记录器自动存储提交到表单的变量。 简介:MaxQ是一个开源的Web功能测试工具。它包含...
关于Imagrium是一个 Jython 框架,用于基于图像识别方法(并根据 MIT 许可条款分发)移动应用程序的跨平台测试。 该框架的核心原则(反映在其设计中)是: 在平台之间共享测试代码库。 换句话说,功能测试应该与应用...
pop800在线工具,免费在的三纯正Grinder是一个负载测试框架,通过Jython来编写测试脚本,基于HTTP的测试可以由浏览器来记录整个要测试的过程。 关键特性: 泛型测试方法 灵活的测试脚本编写
MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制Android设备app,测试其稳定性并通过截屏可以方便地记录出现的...
MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制Android设备app,测试其稳定性并通过截屏可以方便地记录出现的...
软件测试自动化框架(STAF)是一个开放源代码,多平台,多语言的框架,围绕可重用组件(即服务(例如流程调用,资源管理,日志记录和监视))的概念而设计。 STAF消除了构建自动化基础架构的繁琐工作,因此使您...
1.3 测试一个对象是否是类字符串 8 1.4 字符串对齐 10 1.5 去除字符串两端的空格 11 1.6 合并字符串 11 1.7 将字符串逐字符或逐词反转 14 1.8 检查字符串中是否包含某字符集合中的字符 15 1.9 简化字符串的...
3.4.2 在主程序中书写测试代码 3.5 内存管理 3.5.1 变量定义 3.5.2 动态类型 3.5.3 内存分配 3.5.4 引用计数 3.5.5 垃圾收集 3.6 第一个Python程序 3.7 相关模块和开发...
3.4.2 在主程序中书写测试代码 3.5 内存管理 3.5.1 变量定义 3.5.2 动态类型 3.5.3 内存分配 3.5.4 引用计数 3.5.5 垃圾收集 3.6 第一个Python程序 3.7 相关模块和开发...