编程

JAVA内存泄漏——内存泄漏原因和内存泄漏检测工具(zt)

元气小坏坏 提交于 2021-02-17 23:04:06
摘要   虽然Java虚拟机(JVM)及其垃圾收集器(garbage collector,GC)负责管理大多数的内存任务,Java软件程序中还是有可能出现内存泄漏。实际上,这在大型项目中是一个常见的问题。避免内存泄漏的第一步是要弄清楚它是如何发生的。本文介绍了编写Java代码的一些常见的内存泄漏陷阱,以及编写不泄漏代码的一些最佳实践。一旦发生了内存泄漏,要指出造成泄漏的代码是非常困难的。因此本文还介绍了一种新工具,用来诊断泄漏并指出根本原因。该工具的开销非常小,因此可以使用它来寻找处于生产中的系统的内存泄漏。 垃圾收集器的作用   虽然垃圾收集器处理了大多数内存管理问题,从而使编程人员的生活变得更轻松了,但是编程人员还是可能犯错而导致出现内存问题。简单地说,GC循环地跟踪所有来自“根”对象(堆栈对象、静态对象、JNI句柄指向的对象,诸如此类)的引用,并将所有它所能到达的对象标记为活动的。程序只可以操纵这些对象;其他的对象都被删除了。因为GC使程序不可能到达已被删除的对象,这么做就是安全的。   虽然内存管理可以说是自动化的,但是这并不能使编程人员免受思考内存管理问题之苦。例如,分配(以及释放)内存总会有开销,虽然这种开销对编程人员来说是不可见的。创建了太多对象的程序将会比完成同样的功能而创建的对象却比较少的程序更慢一些(在其他条件相同的情况下)。   而且,与本文更为密切相关的是

Solidity编程开发实例

北慕城南 提交于 2021-01-12 20:33:10
Solidity 编程开发实例 接下来的智能合约教程非常复杂,但展示了很多Solidity的编程开发特性。它实现了一个入门的投票合约。当然,电子选举的主要问题是如何赋予投票权给准确的人,并防止操纵。我们不能解决所有的问题,但至少我们会展示如何委托投票可以同时做到投票统计是自动和完全透明。 Voting 投票 思路是为每张选票创建一个合约,每个投票选项提供一个短名称。合约创建者作为会长将会给每个投票参与人各自的地址投票权。 地址后面的人们可以选择自己投票或者委托信任的代表人替他们投票。在投票结束后,winningProposal()将会返回获得票数最多的提案。 /// @title Voting with delegation. /// @title 授权投票 contract Ballot { // 这里声明了复杂类型 // 将会在被后面的参数使用 // 代表一个独立的投票人。 struct Voter { uint weight; // 累积的权重。 bool voted; // 如果为真,则表示该投票人已经投票。 address delegate; // 委托的投票代表 uint vote; // 投票选择的提案索引号 } // 这是一个独立提案的类型 struct Proposal { bytes32 name; // 短名称(32字节) uint voteCount; //

Python编程规范及性能优化

北战南征 提交于 2020-12-19 06:00:57
Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- 。设置编辑器,默认保存为 utf-8 格式。 注释 业界普遍认同 Python 的注释分为两种的概念,一种是由 # 开头的“真正的”注释,另一种是 docstrings。前者表明为何选择当前实现以及这种实现的原理和难点,后者表明如何使用这个包、模块、类、函数(方法),甚至包括使用示例和单元测试。 坚持适当注释原则。对不存在技术难点的代码坚持不注释,对存在技术难点的代码必须注释。但与注释不同,推荐对每一个包、模块、类、函数(方法)写 docstrings,除非代码一目了然,非常简单。 缩进 Python 依赖缩进来确定代码块的层次,行首空白符主要有两种:tab 和空格,但严禁两者混用。如果使用 tab 缩进,设定 tab 为 4 个空格。 公司内部推荐使用 4 个空格的 tab 进行缩进。 空格 空格在 Python 代码中是有意义的,因为 Python 的语法依赖于缩进,在行首的空格称为前导空格。在这一节不讨论前导空格相关的内容,只讨论非前导空格。非前导空格在 Python 代码中没有意义,但适当地加入非前导空格可以增进代码的可读性。 1)在二元算术、逻辑运算符前后加空格:如 a = b + c; 2)在一元前缀运算符后不加空格

程序员如何成为编程高手并以此创业

余生颓废 提交于 2020-12-16 17:01:26
版权声明: 本文为北京尚学堂原创文章,未经允许不得转载。 每个IT企业,尤其是初创企业,非常苦恼:找不到好的程序员。现在大学、软件学院及各种培训机构,每年培养几十万的程序员,毕业的每个人都有同样困恼:找 不到好的工作。问题出在哪里呢?其实,企业需要的是不是刚会写程序的人,需要来了就能干活的人,尤其能把活干好的人。而刚毕业的大学生多半刚学会如何写程 序,的确很难企业需求。 企业到底需要什么样的程序员,一个刚入门的程序员如何成为企业需要的高手呢?还有很多程序员问我,“我需要具备什么样的能力就可以去创业?”我一直在琢磨 类似的问题。我自己写过十年程序,也在金山管理过一千多人的研发队伍,最近也在做天使投资,仔细总结了如下五点建议与所有程序员分享。 建议一:只有真正喜欢才能写好程序 喜欢写程序,做程序员就是上天堂; 不喜欢写程序,做程序员就是下地狱; 程序员需要整天趴在电脑前,经常没日没夜的,非常辛苦,而且工作来不得半点虚假,少写一个标点符号都不行。喜欢的人,日子过得非常开心,每写一行代码,都 会有新的成就,尤其当自己的作品被广泛应用的时候,那种自豪感油然而起。不喜欢的人,坐在电脑前极端无聊,被进度压得喘不过气来,天天为找bug改bug 生气。 只有喜欢,只有热爱,才能把程序写好! 我建议不喜欢写程序的人早点转行,不要勉强自己,免得误人误己。 建议二:把程序当艺术品,象写诗一样来写代码

java的锁机制

本小妞迷上赌 提交于 2020-12-08 08:32:40
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的 权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻 塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他 在锁池中等待的某个线程就可以拿到锁执行同步代码了。这样就保证了同步代码在统一时刻只有一个线程在执行。 众所周知,在Java多线程编程中,一个非常重要的方面就是线程的同步问题。 关于线程的同步,一般有以下解决方法: 1. 在需要同步的方法的方法签名中加入synchronized关键字。 2. 使用synchronized块对需要进行同步的代码段进行同步。 3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。 另外,为了解决多个线程对同一变量进行访问时可能发生的安全性问题,我们不仅可以采用同步机制,更可以通过JDK 1.2中加入的ThreadLocal来保证更好的并发性。 本篇中,将详细的讨论Java多线程同步机制,并对ThreadLocal做出探讨。 大致的目录结构如下: 一、线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? 二

给初学者一封信

六眼飞鱼酱① 提交于 2020-11-27 04:44:59
我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”。不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。 几个误区   初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几种: 认为计算机技术等于编程技术: 有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业,与编程无关的,或者不太相关的课程他统统都不管,极端的学生只要书上没带“编程”两个字他就不看。 其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT业最底层的人是程序员(CODER)。计算机技术包括了多媒体,计算机网络,人工智能,模式识别,管理信息系统等等这些方面

(转载)Bruce Eckel:编程生涯

放肆的年华 提交于 2020-11-23 09:02:43
(转载)Bruce Eckel:编程生涯 作者 Bruce Eckel 是编程界的大牛,著有大名鼎鼎的《Thinking in C++》和《Thinking in Java》。 本文是他对程序员(尤其是新手)的忠告。 大家总是问一个错误的问题:“我应该学习C++还是Java?”在本文中,我将告诉大伙儿:对于选择编程生涯真正需要关注的是哪些问题。 请注意,这篇文章的目标读者并不是那些已经做出自己选择的人。(对于这些人而言)你会继续自己的编程生涯,而不管别人会怎么说。因为它已经渗透到你的血液中,你已经无法摆脱。你已经知道答案:C++、Java、Shell脚本、Python、还有其它一大堆的语言和技术,你都理所当然地会去学习。甚至有可能你才仅仅14岁,就已经知道好几种不同的语言。 问我这样的问题的人可能来自其他行业,或者来自诸如Web开发之类的领域。他们知道HTML是一种类编程语言,而且想尝试构建某些更大型的应用。但我特别希望,当你在问这个问题时,你已经意识到了想要在计算机领域取得成功,你需要掌握自学能力,而且永不停息。 在这个领域做得越多,我越觉得软件开发比任何行业都更接近于写作。 我们从来不知道是什么造就了优秀的作者,我们只知道什么时候我们会喜欢某个人的文字。编程不是一种工程,仅需要把东西从入口倒进去,然后再转动手柄。把软件开发看成确定性的,是一个诱人的想法。因为这个想法

【原创翻译】《GO语言编程入门》

烈酒焚心 提交于 2020-10-29 01:54:34
本人在对CALEB DOXSEY写的《An Introduction To Programming In GO》进行中文翻译, 英文版 地址为: http://www.golang-book.com/ 翻译的内容将陆续地添加进来,并在本页面进行链接更新。 书籍内容的中文目录如下: 目录: 准备工作 文件与文件夹 命令行终端 文本编辑器 GO语言工具 你的第一个程序 如何阅读一个GO程序 习题 类型 数值(number) 字符串(string) 布尔值(boolean) 习题 变量 如何命名变量 作用域 常量 定义多个变量 代码例子 习题 控制结构 for if switch 习题 数组、数组切片、map 数组(array) 数组切片(slice) map 习题 函数 你的第二个函数 多参数返回 可变参数函数 闭包 递归 defer、panic和recover 习题 指针 *和&操作符 new 习题 结构(struct)与接口(interface) 结构(struct) 方法(method) 接口(interface) 习题 并发 协程(goroutine) 通道(channel) 接口(interface) 习题 包(package) 创建包 文档 接口(interface) 习题 测试 习题 核心包 strings(字符处理) io(输入输出) os(文件系统) errors

程序员做些业余项目的重要性

生来就可爱ヽ(ⅴ<●) 提交于 2020-05-03 22:42:37
编程是一种创造过程,业余项目允许程序员在没有截止日期或各种限制的条件下,以探索形式编程。业余项目之所以重要,有以下几个原因。 探索新技术 每天都会不断有新技术出现,开始不知道开发安卓应用需要做保护,如果一旦你的一个应用上市场是为了获得一定的外快,这个就不得不知道。办法总是比困难多,在你还没遇到的时候有人遇到了,并且研究出了解决办法—— 爱加密专业安卓应用加密技术 。同时业余项目则是最佳的试验场。作为业余项目,你不必为bug或者性能问题担心,即使网站崩溃也没有问题,因为你不靠它来领薪水。 从头创造 我所从事的大多数都是为现有的产品做一些维护,增加一些新特性,修复bug,解决性能问题,重构现有代码。虽然我也从头编写过一些软件,但这些基础工作只需要一两个月,接下来我又进入维护模式了。 业余项目经常需要从头构建。我喜欢这个步骤,因为我不但复习了已经掌握的所有东西而且把它们应用到创建一个新的(更好的)项目中。 易于启动 进行业余项目也是一项避免分析瘫痪(analysis paralysis)的练习。如果你从头开始会有各种各样的可能性。避免的方法是给出一个短列表上面列出所有必须具有特性,接下来启动一个beta版本实现那些特性,即所谓的最小可行性产品[TODO]。 编注1:分析瘫痪:对某个问题由于过度分析或过度思考某种情况,以至于没有作出决定或者采取行动。在不同的领域,分析瘫痪有具体的解释

cesium编程入门(六)添加 3D Tiles,并调整位置,贴地

北城余情 提交于 2020-05-01 06:25:00
添加 3D Tiles,并调整位置 3D Tiles 是什么 3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集,3DTiles数据集以分块、分级渲染,将大数据量三维数据以分块,分层的形式组织起来,可以大量减轻浏览器和GPU的负担是一个优秀的,并且格式公开的数据格式。 3D Tiles将用于流式传输3D内容,包括建筑物,树木,点云和矢量数据。 参考 官网 3dtiles 介绍 3D Tiles 3D Tiles将用于流式传输3D内容,包括建筑物,树木,点云和矢量数据。 contextCapture 可以将无人机成果转换成Cesium支持的倾斜摄影成果,当前例子就是使用的这种成果。 数据的加载比较简单 var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: url, //数据路径 maximumScreenSpaceError: 2, //最大的屏幕空间误差 maximumNumberOfLoadedTiles: 1000, //最大加载瓦片个数 modelMatrix: m //形状矩阵 })); 但是问题在于生成的数据不一定是落在地面上,有可能是浮在空中的,例如: 这并不是我们想要的,我们希望拍摄的成果能贴到地面上