- 浏览: 298119 次
- 性别:
- 来自: 合肥
最新评论
-
honey_fansy:
JAVA类加载器分析-比较热部署和"Hot Code Replace" -
xialia8:
有个疑问,WebAppContextClassLoader的p ...
细说Tomcat如何打破双亲委派(有源码和图) -
wwenyunkui:
下载后,进行安装就可以了。https://repos.fedo ...
一键安装Maven/Ant (使用Yum) -
regale:
java用的double,scala用的String,要精确, ...
Scala浮点运算精度问题 -
nomandia:
不错了,之前的方法太麻烦了
一键安装Maven/Ant (使用Yum)
文章列表
一句话概况: 不考虑缓存, 那么装载路径就是,先Classpath, 然后War包,当前工程, 最后才是Tomcat相关目录. 不考虑缓存,是因为缓存只是用来加快速度,对外不调用展现出的逻辑效果是可以忽略的.
下图是一个概况的流程图, 简介起见,绘图过程中移除了缓存功能. (个了感觉还是有些逻辑还是有些复杂的,图画出来了,自己看着都觉得还是不清楚,但是也没发现可以改进的地方)
下面是关键的代码,已经添加了注释.
//WebappClassLoader.loadClass (Tomcat 7.0)
@Override
public s ...
多线程之--2种办法让HashMap线程安全
多线程之--synchronized 和reentrantlock的优缺点
多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync)
HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全.
方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的. 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现.
方法二:重新改写了 ...
Oracle事务的隔离级别有2总, Read Commitment, Serializable, Read Only (另外还有2种事务隔离级别,Read Uncommitted, Repatable Read,Oracle没有单独提供.)
Read Only, 看名字就比较简单,在此我们不做讨论,下面主要分析一下Read Commitment, Serializable.
...
Log4J是如何打印出行号的呢,之前一直以为是通过JAVA的反射.今天特意去查了一下,JAVA的方式好像没有提供这样的接口.于是研究了一下Log4J的代码,现在分享出来.
开门见山:
直接开门见山的讲重点, 其实要获得JAVA的行号,Log4j就 ...
首先纠正一个误区: 热部署不是我们在Eclipse里面修改了代码不用重启就可以持续调试. 详情可以参考上一篇博文: 热部署和"Hot Code Replace"的区别 http://flyfoxs.iteye.com/blog/2078863
热部署有一个缺陷,就是很容易导致内 ...
最近复习JAVA类加载的相关知识,看到了热部署的实现原理,突然感觉这个好像不是以前Eclipse调试Tomcat的时候,修改代码不需要重启就可以调试的功能.查阅资料比较之后,发现不需要重启就可以继续调试的功能是"Hot Code Replace",我个人比较这两者之间的区别如下:
1)如果源文件有修改
热部署会会导致JVM里面有2个不同的Class存在,他们的类加载器不一样.他不会修改JVM已有对象
"Hot Code Replace"会用新的Class替代原有的Class,并且已有的instance都会被替换.也就是现有系统相关对象 ...
上一篇博文: CGLIB学习札记---生成CLASS的命名规则 介绍了生成之类的命名规则, 在这个博文里面主要分析了下面3点:
1)Cglib如何生成的Class的二进制文件
2)Cglib生成的Class二进制(byte[])放哪
3)Cglib如何把二进制Load生成的Class
泛泛而谈,整个过程如下
就是Cglib根据父类,Callback, Filter 及一些相关信息生成key.
然后根据key 生成对应的子类的二进制表现形式
使用ClassLoader装载对应的二进制,生成Class对象,并缓存
最后实例化Class对象,并缓存
下面是相对应的关键代 ...
[置顶] JAVA函数可以修改传入的变量吗?
- 博客分类:
- JAVA
泛泛的谈,可以说,有时可以有时不可以. 那我们就具体些,直入主题,看疗效吧.下面是一个例子:
import java.util.LinkedList;
import java.util.List;
public class Api {
public static final void main(String[] args) {
int tmp = 10;
change(tmp);
//可以看到,传入的temp没有被修改掉
System.out.println(tmp);
List<Integer> list = new Link ...
本文重点是在白话,不是数学上面的严格定义. 那首先要有一个业务场景,就好比上学,学习数据库,就要用到学生成绩. 在这,我们的业务场景就是对100个西瓜进行分类(已知生熟各半)
下面是针对上面场景,对各个术语的解释
准确率(Accuracy): 对所有西瓜分类正确的比率.
精确率(Precision): 挑出来的熟西瓜,有多少是正确的.
召回率(Recall) : 50个熟西瓜,有多少被分来到熟西瓜这个类别.
下面我们来分析各个术语有什么应用场景:
Accuracy: 这个是我们最常用的,但是这个指标有一个缺点,就是当数据分来不均匀的时候,就没办法用于业务了. 比如, ...
什么是熵已经有了很多地方有过解释,在此本文只解释什么是交叉熵,相对熵. 这2个概念也十分容易记混. 看了多方资料后,突然有了醍醐灌顶的感觉,特来分享.
交叉熵:
官方解释:用P来表示Q分布, Q分布对应的平均编码长度.
白话解释:P的熵: 用P的最优编码,所对应的平均编码长度.这个时候已经有了一个编码本了,如果用这个密码本对Q来编码,这个时候的编码长度肯定就会变大了. 这个长度,就是交叉熵.
如何记忆:交叉熵,重点在交叉,也就是用你的编码来给我编码.交换(交叉)编码本.
相对熵:
官方解释:额外所需的编码长度
白话解释:相对熵是比原有的(P)熵变长了的,变 ...
记一次公司内部AI竞赛
- 博客分类:
- 机器学习
历时40多天的Cisco全球AI 竞赛终于落下帷幕,虽然最终只得到第6名(总共有1000多人组成的300多支参赛队伍). 但是作为一个学习AI没多久的小白来说,已经非常知足了.整个竞赛的主题是:客户是否会持续订购公司服务的预测. 回想整个过程,感觉比做一个项目更辛苦,跟磨人, 但也收获颇多.
数据的理解:
说的是AI 维度的选取,但是最重要的还是数据的理解的理解,AI模型和算法虽然同样重要,但是只有对数据理解了才能够对数据进行正确的清洗.
数据的降维:
整个竞赛的数据有240多个维度,但是想对数据降维,还真不是好办的.使用了PCA也没什么思路.但是最后却从应用层面 ...
本系列是理解一些开源项目中已经存在的例子,并配上一些读书笔记,分享出来,也许对其他一些初学者有用, 如果对于分享出来的代码,有问题. 欢迎大家提问交流.
下面的代码节选至:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/notebooks/2_getting_started.ipynb
#@test {"output": "ignore"}
import tensorflow as tf
import numpy as np ...
一句话比较EM与最大似然估计
- 博客分类:
- 机器学习
EM与极大似然估计都是求解模型参数θ,使采样出现的可能性最大,并且EM依赖于极大似然估计.
EM是在抽样有隐含未知的属性,比如西瓜的根蒂脱落,无法统计到根蒂的形状.
EM求解的方法需要迭代下去:
1)也就是给出一个初始的θ,然后求解隐含变量Z的概率
2)根据隐含变量的概率,和抽样的变量. 求解对θ做极大似然估计
反复迭代上面这2步直到收敛.
极大似然估计是在模型已知的情况下,求解模型的参数,让抽样出现的概率最大. 有点类似于已知方程了,求解方程未知数.所以极大似然估计θ值是稳定的.
但是对于EM,由于有未知变量的存在,所以往往初 ...
之前一直知道装饰器可以增强一个已经存在的方法,Python也提供了annotation的方法,很好用. 但是再看flask login的扩展包的时候. 发现装饰器还可以实现回调函数的注册功能.
flask login就是通过下面的装饰器,来注册回调函数,当没有sessionID时,通过装饰器指定的函数来读取用户到session中.
@login_manager.user_loader
下面写了一个简单的测试例子来演示这个功能.
import time
import functools
class Test():
#/**feature将调用c ...
import redis
enable=True
#enable=False
def readRedis(key):
if enable:
r = redis.Redis(host='10.224.38.31', port=8690,db=0, password='xxxx')
val = r.get(key)
if val is None:
print "can not find data for KEY:%s \n" % (key)
retu ...