201809-13 Java序列化的状态 关键要点Java序列化在很多库中引入了安全漏洞。对序列化进行模块化处于开放讨论状态。如果序列化能够成为模块,开发人员将能够将其从攻击表面上移除。移除其他模块可以消除它们所带来的风险。插桩提供了一种编织安全控制的方法,提供现代化的防御机制。多年来,Java的序列化功能饱受安全漏洞和zero-day攻击,为此赢得了“持续奉献的礼物”和“第四个不可饶恕的诅咒”的绰号。作... 继续阅读 >
201807-10 Java并发编程-volatile 上一篇文章,学习了并发编程中的synchronized,这个比较好理解,也是我最初学习多线程编程中的一个简单的实现的,大学的时候就会了,然后就一直以为多线程环境的同步只能通过这个来实现的,事实上Java还提供了另外一个更加轻量级的实现-volatile,如果说synchronized实现了数据在同一时刻只能有一个线程对数据访问的话,那么volatile实现的就是同时可以多个线程在访问数据,但是只要数据发生了变化,便确保其他线程及时“感知”... 继续阅读 >
201803-23 Java 堆内存溢出梗概分析 任何使用过基于Java的企业级后端应用的软件开发者都会遇到过这种低劣、奇怪的报错,这些报错来自于用户或是测试工程师: java.lang.OutOfMemoryError:Javaheapspace。为了弄清楚问题,我们必须返回到算法复杂性的计算机科学基础,尤其是“空间”复杂性。如果我们回忆,每一个应用都有一个最坏情况特征。具体来说,在存储维度方面,超过推荐的存储将会被分配到应用程序上,这是不可预测但尖锐的问题。这导致了堆内... 继续阅读 >
201801-29 面试必问的 volatile,你了解多少? 前言Java中volatile这个热门的关键字,在面试中经常会被提及,在各种技术交流群中也经常被讨论,但似乎讨论不出一个完美的结果,带着种种疑惑,准备从JVM、C++、汇编的角度重新梳理一遍。volatile的两大特性:禁止重排序、内存可见性,这两个概念,不太清楚的同学可以看这篇文章->javavolatile关键字解惑概念是知道了,但还是很迷糊,它们到底是如何实现的?本文会涉及到一些汇编方面的内容,如果多看几遍... 继续阅读 >
201801-16 每日一博 | 记一次 JVM 堆外内存泄露 Bug 的查找 解Bug之路-记一次JVM堆外内存泄露Bug的查找前言JVM的堆外内存泄露的定位一直是个比较棘手的问题。此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤了Bug的源头。笔者将此Bug分析的过程写成博客,以飨读者。由于物理内存定量分析部分用到了linuxkernel虚拟内存管理的知识,读者如果有兴趣了解请看ulk3(《深入理解linux内核第三版》)内存泄露Bug现场一个线上稳... 继续阅读 >
201712-11 你所不知道的Java之HashCode 之所以写HashCode,是因为平时我们总听到它。但你真的了解hashcode吗?它会在哪里使用?它应该怎样写?相信阅读完本文,能让你看到不一样的hashcode。使用hashcode的目的在于:使用一个对象查找另一个对象。对于使用散列的数据结构,如 HashSet、HashMap、LinkedHashSet、LinkedHashMap ,如果没有很好的覆写键的hashcode()和equals()方法,那么将无法正确的处理键。 请对以下代码中 Person&nb... 继续阅读 >
201710-13 Java在线问题排查利器之Btrace&Greys 1.前言前段时间升级了urs新的远程cookie校验模式。功能上线后,发现涉及用户cookie校验的接口,有时会报接口超时。通过日志埋点方式,确认了与urs提供的jar包内的新验证方法有关。通过反编译,看到相关方法执行过程中涉及参数校验、参数组装、远程访问校验、本地校验等步骤,究竟哪个步骤出了问题?一种方式是让urs帮忙提供一个新的jar包,在关键步骤处加日志,记录执行时间,另一种方法,就是使用一些在线分析工具... 继续阅读 >
201710-03 写出优质Java代码的4个技巧 译者注:如果现在要求对你写的Java代码进行优化,那你会怎么做呢?作者在本文介绍了可以提高系统性能以及代码可读性的四种方法,如果你对此感兴趣,就让我们一起来看看吧。以下为译文。我们平时的编程任务不外乎就是将相同的技术套件应用到不同的项目中去,对于大多数情况来说,这些技术都是可以满足目标的。然而,有的项目可能需要用到一些特别的技术,因此工程师们得深入研究,去寻找那些最简单但最有效的方法。在前一篇... 继续阅读 >
201710-03 Java数据结构与算法解析——伸展树 伸展树简介伸展树(SplayTree)是特殊的二叉查找树。它的特殊是指,它除了本身是棵二叉查找树之外,它还具备一个特点:当某个节点被访问时,伸展树会通过旋转使该节点成为树根。这样做的好处是,下次要访问该节点时,能够迅速的访问到该节点。特性1.和普通的二叉查找树相比,具有任何情况下、任何操作的平摊O(log2n)的复杂度,时间性能上更好2.和一般的平衡二叉树比如红黑树、AVL树相比,维护更少的节点额... 继续阅读 >
201708-29 Java中处理异常的9个最佳实践 Java中的异常处理不是一个简单的话题。初学者很难理解,甚至有经验的开发人员也会花几个小时来讨论应该如何抛出或处理这些异常。这就是为什么大多数开发团队都有自己的异常处理的规则和方法。如果你是一个团队的新手,你可能会惊讶于这些方法与你之前使用过的那些方法有多么不同。然而,有几种异常处理的最佳方法被大多数开发团队所使用。下面是帮助改进异常处理的9个最重要的方法。1.在Finally中清理资源或者使用... 继续阅读 >
201708-16 进阶必备 - Java 反射由浅入深 本博文主要记录我学习Java反射(reflect)的一点心得,在了解反射之前,你应该先了解Java中的Class类,如果你不是很了解,可以先简单了解下。一、Java反射机制参考了许多博文,总结了以下个人观点,若有不妥还望指正:Java反射机制在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态的获取信息以及动态调用对象的方法... 继续阅读 >
201707-28 Java的21个技术点,你知道吗? 关于Java的编程知识,有人会问哪几个是重要的知识点,不知道大家是否知道呢?给大家分享一下。1.JVM相关(包括了各个版本的特性) 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可。不过对于一个有着3年以上Java经验的资深开发者来说,不会JVM几乎是不可接受的。JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透。我在面试有... 继续阅读 >
201707-26 PHP 程序员如何快速进行 Java 开发 入门不要拿着放大镜去学就像盲人摸象一样,他要想弄清楚大象的真实面貌可能要摸很久,就好比我们拿着放大镜在学习java一样,java经过这么多年的发展,可以说非常庞大。如果我们要知道大象长什么样,就应该放下手中的放大镜,向后退远点,反而能够非常清晰的看到它的全貌。学习一门新的语言也一样,有很多很多网上的教程,非常的大而全,一般得系统的学习30~60小时之后才能正式的接触项目开发。基础很重要,但是学习了太... 继续阅读 >
201705-09 Java多线程基础 线程的等待与唤醒 题图:花啡,豆是买咖啡机送的,花是上周阳朔旅游买的桂花,给它起了个名字,叫Sunday。咖啡味淡了一点点,多了一份桂花的清香。本篇我们来研究一下wait()notify()notifyAll()。DEMO1:wait()与notify()publicclassTest{staticclassThreadOneextendsThread{privateCallbackmCallback;@Overridepublicvoidrun(){work();if(mCallback... 继续阅读 >
201704-13 Java程序员应当知道的10个面向对象设计原则 面向对象设计原则是OOPS编程的核心,但我见过的大多数Java程序员热心于像Singleton(单例)、Decorator(装饰器)、Observer(观察者)等设计模式,而没有把足够多的注意力放在学习面向对象的分析和设计上面。学习面向对象编程像“抽象”、“封装”、“多态”、“继承”等基础知识是重要的,但同时为了创建简洁、模块化的设计,了解这些设计原则也同等重要。我经常看到不同经验水平的java程序员,他们有的不知道这些OOPS和SOLI... 继续阅读 >
201704-07 Android性能优化系列之Bitmap图片优化 在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎,就容易造成OOM(Java.lang.OutofMemoryError-内存溢出),本篇博客,我们将一起探讨Bitmap的性能优化。为什么Bitmap会导致OOM?1.每个机型在编译ROM时都设置了一个应用堆内存VM值上限dalvik.vm.heapgrowthlimit,用来限定每个应用可用的最大内存,超出这个最大值将会报OOM。这个阀值,一般根据手机屏幕dpi大小递增,dpi越小的手机,每个... 继续阅读 >