14 天前 / 冷星1024
代码不会全部按照我们的预期运行,可能会有意料之外的情况,为了保证程序的健壮性,要进行异常处理。 比如一个对象的所有方法,都应该做异常处理,但是,如果每个方法都加 try catch 又太麻烦: constobj={ aaa(){ try{ //aaa }catch(e){ //xxxx } }, bbb(){ try{ //bbb }catch(e){ //xxxx } }, ccc(){ try{ //ccc }catch(e){ //xxxx } } } 有没有一种方式既能对所有方法做异常处理,又不用重复写这么多次呢? 有,就是代理模式。
136 天前 / 浪客书心
Java 进阶之字节码剖析中我曾经提到这么一段话 int[128][2] ,int[256] 这两个数组看起来一样,但实际上前者比后者多了 246% 的额外开销 针对这句话我收到了几位读者的私信,表示不明白为啥不过一个简单的二维数组会有这么大的开销,本来这个问题在我正在写的类加载机制中有详述,不过文章还没写完(估计本周发),所以我专门抽出这个问题探讨一下,五分钟就能看懂。 Java 对象模型 HotSpot JVM 底层使用名为 oops (Ordinary Object Pointers) 的数据结构来表示对象的对象头 classoopDesc{ friendclassVMStructs; private: volatilemarkOop_mark; union_m...
153 天前 / 老白经
前言:第一部分「python 核心」告一段落,接下来将花三篇文章对「面向对象」进行梳理。今天的内容主要内容有: 01 面向过程 & 面向对象 1.1 概述 1.2 类和对象 02 类和对象 2.1 语法 2.2 实例变量 & 实例方法 2.3 跨类调用 2.4 类变量 & 类方法 (明天继续) 2.5静态方法 03 内存分配 01面向过程和面向对象 1.1 概述 把大象关冰箱需要几步?以下是两种不同的思路。 面向过程(手动挡):打开冰箱门→把大象装进去→关上冰箱门 面向对象(自动挡):滴!门开了→滴!大象进去了→滴!门关了 如果让你选择其中一种方式...
390 天前 / 汤圆学Java
简介当一个线程修改了某个共享变量时(非局部变量,所有线程都可以访问得到),其他线程总是能立马读到最新值,这时我们就说这个变量是具有可见性的 如果是单线程,那么可见性是毋庸置疑的,肯定改了就能看到(直肠子,有啥说啥,大家都能看到) 但是如果是多线程,那么可见性就需要通过一些手段来维持了,比如加锁或者 volatile 修饰符(花花肠子,各种套路让人措手不及) PS:实际上,没有真正的直肠子,据科学研究表明,人的肠子长达 8 米左右(~身高的 5 倍) 目录单线程和多线程中的可见性对比 volatile 修饰符指令重排序 volatile 和加锁的区别正文...
434 天前 / minwk
前言在日常工作中,我们经常会遇到对一个列表的每一项求合计,然后追加到列表的最后一行。如 方案修改该统计查询的 sql,在里面追加一行合计计算。不太好的地方就是在 sql 有好多的函数计算,而且还要修改这个统计的 sql,本来 sql 已经很复杂,然后再加就搞得又臭又长。在代码中计算,这个也是比较麻烦。所以拿出来我这个方法了之前我是这样写的,遍历集合中的每个对象,求和,将和放到新对象然后追加到集合中 123456789101112131415161718private void sumDataScreening(List list) { IpepShipWasteData data = new IpepShipWasteData(); ...
481 天前 / CodaVald
首发于 Java 细谈写文章对象是怎么无中生有的?看完这一篇就够了 codevald 一名懂网络的 Java 后端开发工程师在现实世界中,找对象是一门学问,找对象不在于多而在于精 在计算机世界中,面向对象编程的关键在于能否灵活地运用类,如何设计出一个符合需求的对象也是也是值得学习和思考的。 那么,面向对象编程到底是什么? 在面向对象编程中,肯定会涉及类和对象两个概念。类是什么?对象是什么,两者有什么关系? 接下来就一 一地来解答这些疑惑吧 类和对象类,是指将相同属性的东西放在放在一起,类是一个模板,能够描述一类对象的状态和行为而对象...
892 天前 / Darkness463
前段时间发了一篇又见【不使用的对象应手动赋值为null】,之后又想了想,发现在变量会不会被回收这个问题上还是有一些地方说不清楚,于是再次研究了一下。 疑问还是用上篇文章的例子,我们来看看字节码。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263// placeHolder不会被回收public static void main(String[] args) { if (true) { byte[] placeHolder = new byte[64 * 1024 * 1024]; System.out.println(placeHolder.length / 1024); } System.gc...
939 天前 / 封心SH
点击上方蓝字可以订阅哦 其实创建对象与ConcurrentHashMap之间并没有必然联系,不过很多知识是环环相扣的,这篇文章权当做一次温习吧。 对象和锁 如下代码,在new一个对象后,jvm会先检查Student类是否已被加载,若未加载则先加载,否则在堆区创建该对象。Studentstu=newStudent();既然对象是分配在堆区,那么对象在堆区的存储结构是怎样的呢,其实主要分为三个部分:对象头 实例数据 填充数据 这里重点看“对象头”,对象头主要存储信息如下所示。 可以看到,MarkWord标志位存放了对象的锁信息。
1001 天前 / 简
最近在了解Python语言中各种数据结构的使用的内存情况,写几篇文章和大家分享。 计算机存储单位先铺垫一点基础知识。计算机存储单位一般用 Bit, Byte, KB, MB, GB, TB, PB等表示。他们由小到大递增: Bit(比特)。Bit是Binary digit(二进制数字)的缩写,最小的存储信息单位,存放一位二进制数,即 0 或 1。 Byte(字节)。8个二进制位(Bit)为一个字节(B),字节是最常用的存储容量单位。 KB(Kilobyte,千字节)。1KB = 1024Byte MB(Megabyte,兆字节,简称「兆」)。1MB = 1024KB GB(Gigabyte,吉字节,又称「千兆」)。
1004 天前 / 豌豆花下猫
“Python猫” ,一个值得加星标的公众号 前不久,我写了一篇文章回顾 Python 中 print 的发展历史,提到了两条发展线索: 明线:早期的 print 语句带有 C 和 Shell 的影子,是个应用程序级的 statement,在最初十几年里,经历过 PEP-214 和 PEP-259 的改进;再到 2009 年的大版本 3.0,由语句改成了 print() 函数,还在 3.3 版本,做过一次功能增强,最终上升成为一等的内置函数。暗线:介绍了 print 的竞争对手们,像传统的日志模块 logging、调试模块 pdb、主流 IDE 的调试功能,以及后起之秀 PySnooper,它们瞄准着 print 的位置,摩拳擦掌...
1028 天前 / Hollis
△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第222篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆、栈、方法区等介绍的比较清楚。 上图,是一张在作者根据《Java虚拟机规范(Java SE 8)》中描述的JVM运行时内存区域结构画的。 很多人都知道Java对象是在堆内存中分配空间的(JIT优化除外),也知道内存分配过程中是线程安全的,那么虚拟机到底是如何保证线程安全的呢?本文就来简单介绍一下。
1095 天前 / 智能大石头
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。 开源地址:https://github.com/NewLifeX/X(求star, 770+) 单对象缓存前文提到了以sql为key的数据层缓存,以及整表缓存的实体列表缓存,各自有其优缺点,适用于不同场合。 当单表数据较大(10万+)时,两者就无能为力了。
1132 天前 / LinuxEverything
点击上方蓝色字关注我们~ Making slab-allocated objects movableByJonathan CorbetApril 8, 2019 https://lwn.net/Articles/784964/ Memory fragmentation(内存碎片化)是内存管理子系统的常见问题。多年来,开发者在减少Linux内核fragmentation方面做了很多工作,但几乎都是以page为单位来避免fragmentation的。而slab分配器管理的内存多数是小于一个page size的,很少有针对它做的优化。但实际上slab的fragmentation也可能会导致整个系统出现问题。
1153 天前 / cbsheng
// 旧sds结构体struct sdshdr {int len; // buf中已用字节长度int free; // buf中未用字节长度char buf[] // 存放实际字符串的地方}新版代码中提高了sds对内存的利用率,例如两个字节的字符串对应的sds对象,就没必要将len字段定义为int类型了,uint8足够。所以对于不同长度的字符串,实际结构体中len这些字段类型也不同。但sds却对上层使用方保持一致的接口,隐藏底层结构体差异性的细节。
1157 天前 / 恒生技术君
JAVA对象和它的内存管理 对象的访问方式 建立对象是为了使用对象,Java程序需要通过栈上的reference数据来操作堆上的具体对象。在Java虚拟机规范里面只规定了 reference类型是一个指向对象的引用,并没有定义这个引用应该通过什么种方式去定位,访问到堆中的对象的具体位置,对象访问方式也是取决于虚拟机实现而定的。主流的访问方式有使用句柄池和直接指针两种。 这两种对象访问方式各有优势,使用句柄来访问的最大好处就是reference中存储的是稳定句柄地址...