蘭陵N梓記

一指流沙,程序年华


  • 首页

  • 归档

  • 关于

  • 搜索
close

飞哥讲代码1:确保资源被释放

时间: 2020-05-16   |   分类: 技术     |   阅读: 2345 字 ~5分钟

案例

下面的代码来自我们某一工具源码(Python语言)中:

file_gz = gzip.GzipFile(file_name)
src_path, src_file = os.path.split(file_name)
tmp_file_name = os.path.join(path_name, src_file).strip('gz').strip('.')
tmp_file = open(tmp_file_name, 'wb')
tmp_file.writeline(file_gz.realines())
file_gz.close()
tmp_file.close()
os.remove(file_name)

从代码健壮角度来看,存在如下两个问题:

  • 缺少捕获异常,在GzipFile打开文件,open打开文件之后的操作都可能抛出异常
  • 当抛出异常时,file_gz与tmp_file就会出现未正常close,存在文件句柄的泄露问题

能正确释放资源的建议写法是:

阅读全文 »

阅读

时间: 2020-03-29   |   分类: 感想     |   阅读: 850 字 ~2分钟

生于80后,长相70后的我们,不知不觉已将跨入不惑不年。但还是为了房子、孩子、票子日复一日地忙碌工作,曾经年少的理想也慢慢被岁月磨平,也根本没有精力抽出一丁点的时间来读一本书,仰望一下星空。有人说:一日不读书,无人看得出;一周不读书,开始会爆粗;一月不读书,智商输给猪。当停下手中的工作工作,才发现自己知识结构那么地匮乏。

曾经梦想把阅读当成生活的重要组成部分,把阅读当作精神升华的方式。有自己一个独立的书房,书柜上摆上经典的、实用的、消遣的书籍,在空闲的时间里抱上一本细细咀嚼,娴静地阅读,享受书的世界,感受书的力量。

有些事,我们明知道是错的,也要去坚持,因为不甘心;有时候,我们明知道没有路了,却还在前行,因为习惯了。没有正确的方向,再多报努力也可能没有结果。阅读才能使自己的内心强大,也不会陷入死胡同,走正确的路,即时放弃错误的持着。

阅读全文 »

软件工程文化

时间: 2020-03-22   |   分类: 技术     |   阅读: 1438 字 ~3分钟

软件危机

软件工程师的困惑:软件具有太多的不确定性,软件工程师每天日复一日的工作,大多数面对的都是自己目前不知道答案的问题。我们依赖着过去的经验,朝着大致的方向,努力地解决一个又一个问题。但历史的经验并不解决未来的问题,反面太多成功的经验可能会让我们陷入经验主义。我们也会经常责怪前人犯下的错误,需要我们去应对。我们讨厌需求的变更,它让我们曾经的付出付诸东流。变更是软件开发中不可避免的,所以我们在任何的阶段都要去适应变。即使软件发布了,也不可能一劳永逸,它像一个生命体还得继续维护。

从软件项目管理角度的困惑,软件存在所谓的软件危机:软件的开发进度难以预测;软件的开发成本难以控制;软件的功能难以满足用户;软件的产品质量无法保证;软件产品难以维护…..

阅读全文 »

开源软件知识

时间: 2019-10-13   |   分类: 技术     |   阅读: 3804 字 ~8分钟

什么是开源软件

开放源代码促进会(OSI:Open Source Initiative),是一个致力于推动开源软件发展的非盈利组织。

开源软件(OSS:Open Source Softwar)即开放源代码软件,其定义首先起源于自由软件(FS:Free Software)。OSI将开放源码定义为:“开放源码,通过支持源代码的独立同行评议和快速发展演变,提高了软件的可靠性和质量。要通过 OSI 认证,软件必须在获得许可证的情况下发布,该许可证可保证免费读取、重新发布、修改和使用该软件的权利。

开源软件的特点:可自由使用、无任何担保、无许可费、可获得源代码、享有版本、有特定License

开源软件的三大组成要素;

  • License:是游戏规则 ,有严密的组织监管
  • 社区是组织方式:是其发展的核心学问所在,主要特征:无明确路标、子项目充分竞争、充分的对等评审、用户充分参与、源码发布、经常发布,Internet发布。
  • 商业模式是本质:模式并不是其独有的,主要包括:捐赠、技术服务、广告、增值产品,双重授权、软硬件结合等。
阅读全文 »

跟我一起复习Java-10:工具体系

时间: 2019-10-06   |   分类: 技术     |   阅读: 4343 字 ~9分钟

JVMTI

JVMTI(Java VM Tool Interface)就是JVM对外暴露的接口。

JVMTI 本质上是在JVM内部的许多事件进行了埋点。通过这些埋点可以给外部提供当前上下文的一些信息。甚至可以接受外部的命令来改变下一步的动作。外部程序一般利用C/C++实现一个JVMTI Agent,在Agent里面注册一些JVM事件的回调。当事件发生时JVMTI调用这些回调方法。Agent可以在回调方法里面实现自己的逻辑。JVMTI Agent是以动态链接库的形式被虚拟机加载的。

JVMTI Agent启动方式: -agentlib:<agent-lib-name>=<options>

JVMTI Agent回调函数:

  • OnLoad阶段: 调用动态库的Agent_OnLoad函数
  • Live阶段: 调用动态库的Agent_OnAttach函数
  • 关闭阶段:调用动态库的Agent_OnUnload函数
阅读全文 »

跟我一起复习Java-9:JNI/JIT/SM

时间: 2019-10-05   |   分类: 技术     |   阅读: 3911 字 ~8分钟

JNI

JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。

JNI开发流程主要分为以下6步:

  1. 编写声明了native方法的Java类
  2. 将Java源代码编译成class字节码文件
  3. 用javah -jni命令生成.h头文件(javah是jdk自带的一个命令,-jni参数表示将class中用native声明的函数生成jni规则的函数)
  4. 用本地代码实现.h头文件中的函数
  5. 将本地代码编译成动态库(windows:*.dll,linux/unix:*.so,mac os x:*.jnilib)
  6. 拷贝动态库至 java.library.path 本地库搜索目录下,并运行Java程序
阅读全文 »

跟我一起复习Java-8:内存模型

时间: 2019-10-04   |   分类: 技术     |   阅读: 6803 字 ~14分钟

内存模型

java_memory3.png

堆

堆(Heap)是JVM所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中)。堆由垃圾收集器自动回收,是OOM故障最主要的发源地。

通过下两个参数来分配堆使用的内存大小:

  • -Xms:最小堆容量,默认是物理内存的1/64。
  • -Xmx:最大堆容量,默认是物理内存的1/4。
阅读全文 »

跟我一起复习Java-7:泛型

时间: 2019-10-03   |   分类: 技术     |   阅读: 4384 字 ~9分钟

泛型

泛型是Java 5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。

泛型使类型(类和接口)在定义类、接口和方法时成为参数,好处在于:

  • 强化类型安全,由于泛型在编译期进行类型检查,从而保证类型安全,减少运行期的类型转换异常
  • 提高代码复用,泛型能减少重复逻辑,编写更简洁的代码
  • 类型依赖关系更加明确,接口定义更加优好,增强了代码和文档的易读性

实现

Java 5推出了泛型,也就是在原本的基础上加上了编译时类型检查的语法糖。泛型对于JVM来说是透明的,有泛型的和没有泛型的代码,通过编译器编译后所生成的二进制代码是完全相同的。这个语法糖的实现被称为擦除。Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。

无论何时定义一个泛型类型,都自动提供一个相应的原始类型(Raw Type,这里的原始类型并不是指int、boolean等基本数据类型),原始类型的类名称就是带有泛型参数的类删去泛型参数后的类型名称,而原始类型会擦除(Erased)类型变量,并且把它们替换为限定类型(如果没有指定限定类型,则擦除为Object类型)。

泛型变量的类型的使用:

  • 在调用泛型方法的时候,可以指定泛型,也可以不指定泛型
  • 在不指定泛型的情况下,泛型变量的类型为 该方法中的几种类型的同一个父类的最小级,直到Object
  • 在指定泛型的时候,该方法中的几种类型必须是该泛型实例类型或者其子类
阅读全文 »
2 3 4 5 6 7 8 9 10
兰陵子

兰陵子

Programmer & Architect

164 日志
4 分类
57 标签
RSS 订阅
GitHub 知乎
© 2009 - 2022 蘭陵N梓記
Powered by - Hugo v0.101.0
Theme by - NexT
0%