`
soleghost
  • 浏览: 41876 次
  • 性别: Icon_minigender_1
  • 来自: 未知
社区版块
存档分类
最新评论
文章列表
Java内存区域与OOM  http://www.iteye.com/topic/802573 ·程序计数器:保留线程执行到的指令 ·栈:编译期间预期的变量表。层次深:栈溢出;无法创建更多的栈OOM;线程个数=(系统内存-堆-年老代-保留区域)/每个栈空间 ·本地栈:native,也会OOM ·堆(eden、s0、s1+old):生成大量无法回收的对象OOM ·方法区:加载类过多OOM ·常量区:生成太多常量OOM     垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 ·引用计数器:简单,但无法找到循环引用的情况 ·搜索算法 ...
项目过去都3个多月了,也没系统的总结,今天总结一下   系统背景: 1.访问量大:每天承受20亿+服务调用 2.海量数据:核心表都是5亿条数据,而且每天还在以几十万的速度增加 3.之前架构:由于读写比例很高,已经采用分 ...
http://blog.csdn.net/yzsind/archive/2010/12/06/6059209.aspx
看了《关于系统性能的思考》,结合自己平时的工作和身边的教训,谈谈自己的一些关于性能的想法   1.性能和容量不是一个概念,在相同条件下,当然性能如果越好,容量会越高   2.性能优化真的不是定式的,还需要相当丰富的经验去解决。以自己身边的系统为例,从Apache、Jboss、F5、网络、应用系统、到最后的DB,就如同是一条回家的路,任何一个环节处理慢了,都可能成为性能的瓶颈   3.一般涉及到性能的地方: 3.1.cache:缓存一切可以缓存的数据。比如数据字典、配置、读多写少的数据,但如果是敏感数据,比如资金,不建议缓存。 3.2.异步:异步一切可以异步的操作。意义不仅仅在于性 ...

logger的功能

1.最明显的功能,排查线上问题。    平时遇到bug时,要相信“人走过,必留下痕迹”,没有什么事情是没有原因的。   2.报警    我们的系统越来越多,业务越来越多,不可能靠人肉每天查询日志以发现问题,还是要利用机器。    针对具体的业务,打印具体格式的日志,通过日志收集系统的规则,发现问题则向相关人员报警。怎么实现日志收集系统呢,可以每隔一段时间,从生产环境中获取指定日志,每次读取后,记录本次读取日志的最后行数,下次再收集日志时,从该行数开始读取新的时间段的日志。   3.统计业务    还是要规范我们的摘要日志的格式,将每次读取的日志写入数据库,比如:    ---- ...
在生产环境中,针对具体问题的追踪,没有debug,只有利用logger排查问题,这就要求我们打印logger,具体有哪些logger呢?   1.摘要日志    同步service层摘要日志,打印调用服务,入参,执行时间,执行结果    异步事件接收摘 ...
在应用中,总有一些业务操作可能会引起大数据量的查询,基于应用健壮性的考虑,需要对这些业务控制起来。   思路:外围业务每次请求时,应用每次申请一个资源,当超过限定的资源总数时,不允许业务继续进行.       try{            applyResource();           do业务();        }        finally{             releaseResource();        }       实现1:在数据库中,针对具体业务插入一条记录(sysName,sysCount),      synchronized void ...
在有些业务背景下,需要cache防止并发的情况,然后cache却不能提供锁的功能,可以由应用代为实现   1.第一次存入cache的数据时,加一个modifiedTime的时间戳 2.下次更新的时候,必须保证取到当前的时间戳和cache中数据的时间戳一致,这样才可以更新;否则直接removecache,不要影响到正常业务。   其实,这种乐观锁的实现,和DB层的乐观锁实现原理是一样的,即先操作业务,具体执行时必须和DB/cache中的版本或者时间戳保持一致。  
在大型的互联网应用中,如果缓存的是大量的数据,可以考虑多级缓存数据 1.第一级cache:本地线程cache    每次将数据放入线程cache(利用ThreadLocal)中,可以避免同一个线程中对同一个缓存数据的访问   2.第二级cache:本地内存cache    利用appserver的内存,将数据放入本地的内存缓存,可以用的工具有EHCache   3.第三级cache:远程cache    利用分布式缓存,当线程cache、内存cache都没有命中时,再去查询远程缓存。可以利用的工具有memcache   4.第四级cache:就是DB了:)    前三层缓存 ...
这篇没有任何技术含量,仅仅是一个良好的编程习惯   随着应用中缓存的业务数据越来越多,为了防止不同业务的key相互覆盖的情况,有个简单的办法,对不用的业务的数据分组,比如: 业务1 prefix1+key 业务3 prefix2+key 业务2 prefix3+key   这样之后,即时各个业务的key相同,也可以防止数据被相互覆盖的情况  
如果我们对一个比较复杂的模型做cache,会有如下需求: 1. 利用多个key去查询这一模型的cache 2. 继而要求可以利用多个key去删除cache时   如果按照最简单的模型,每个key对应一个cache数据,这样当某一个key对应cache中的数据变动时,另外一个key对应的cache数据必定成为脏数据。 举例:key1->cacheObject,key2->cacheObject,当put(key1,cacheObject)时,key2对应的数据必定是脏数据;或者remove(key1)时,key2对应的cacheObject也还是会存在的,也是脏数据。   ...
在我们的应用中,有一张表的查询量非常之大,高峰期时6000次/second查询,而且更新很少,于是我们的改造来了:   第一次优化: 方法:每次从cache中读取,如果cache中没有命中,则从DB读取,如果有值将此值放入cache中。 效果:上线后效果并不是特别明显,高峰期仍有3000次/second的查询,原因在哪里呢?此表只有700w的数据量,但是对于3亿用户,每个用户都要查询此表,就是说,只有700w/3亿=2.33%可以命中cache,间接导致每次从cache中取数据为空后,仍有97.67%的数据仍然会查询DB。   第二次优化: 方法:每次从DB中查询后,如果是空,则在 ...
在支撑大规模、高并发、高可用的互联网应用中,异步更新分布式缓存的应用已经越来越多了(为什么是异步更新缓存,因为异步不仅可以提高系统性能,而且提高系统的伸缩性和可用性),由于缓存的更新是异步的,可能由于多个更新缓存的并发线程而导致的脏数据。   举例,有下面2个线程A、B同时执行业务,执行完业务之后,会产生2个异步的线程A1、B1去更新缓存,在理想情况下,A1和B1应该保持顺序性,即A1先更新缓存、B1再更新缓存,但是由于线程本身是异步的,加上2个线程可能分布在不同应用服务器上,所以对执行线程时顺序没有办法保证,如果B1先执行,A1再执行,这样B1的数据就被A1覆盖掉,从而导致脏数据。有没有什 ...
2008年12月份 收费改造,第一次通宵发布系统;这是刚毕业不久后进入公司,抱着对学习饥渴的心态,申请晚上通宵留守,发布成功,晚上12点吃了一顿烧烤,4点发布完成后监控没有问题,6点和若干开发还在局域网内打了几盘cs,7点pm把热腾腾的豆浆煎饺送上,上午9点和其他开发交接后,10点回家睡觉   2009年11月份 新的个人版发布,作为核心业务的提供方,留守发布,这次同样有烧烤,我们的系统发布没有问题,但是不幸的是,个人版系统由于事前没有评估到某个业务带来的消息挤压,导致下午全站宕机2小时,经验值得学习,教训值得警醒。   马上就到来的2010年7月7日凌晨 虽然这一刻还没到来,但依 ...
以前谈过重用的粒度问题,今天也谈谈冗余的粒度。   1. 数据库字段的冗余     好处1:合适字段的冗余,对于提供数据库的查询速度会有很大提升,因为可以不用于其他表join去获取数据     好处2:在垂直分库的情况下,丧失了join数据表的能力,为了不让业务受伤害,在表上加上一些冗余,同样可以满足业务的需求     坏处:需要在多个表中维护数据的一致性 2. 业务中多个表的冗余     一个最简单的道理,对于大型互联网,比如一次交易,数据会放入不同的业务系统中。比如:买家的交易信息、卖家的交易信息、支付订单的信息、收费的信息、账务的信息、会计的信息。     好处:其实这就是 ...
Global site tag (gtag.js) - Google Analytics