Fork me on GitHub

线程相关的基础问题

mark

本文主要讲述了进程和线程发展简史,对于JVM来讲的进程和线程又是什么,Thread的start()方法的原生调用发生了什么,从而理解start()方法和run()方法有什么不同,另外,还介绍了三种处理线程执行完成后的返回值的方法,其实FutureTask和线程池获取线程执行结束的返回值更加常用。另外,介绍了线程的六种状态,还有sleep和wait的区别,notify和notifyAll的区别,yield函数的作用,以及如何优雅的中断线程等问题。

阅读更多...

OkHttp的使用与跳坑示例

mark

OkHttp是一个优秀的网络请求框架,我开始接触Android开发的时候就用过这个网络请求框架,官方的参考文档在这里 https://square.github.io/okhttp/ ,本文演示了使用OkHttp框架进行简单的Get、Post(表单形式和JSON形式)、Delete、附加请求头、请求异步回调,文件的上传和下载等常用操作。最后记录了一个今天调试了很久的坑,那就是response.body().string()只能有效调用一次,注意Debug的时候对结果造成的改变!JDK9的HttpURLConnection有很多变化,下次博客中会有演示和说明。

阅读更多...

Docker私服配置HTTPS

mark

上图即使我搭建完毕的效果。对于Docker的环境安装,基础命令之类的内容,通读官网文档内容基本都能顺利掌握。 然而,当笔者尝试着搭建一套基于SSL的Docker Registry(官网推荐的做法)却遇到了不少的麻烦,对于这部分内容,大多数博客文档内容都是直接跳过了SSL的环节,采用了HTTP的访问形式。 然而本文就是记录一下对于搭建HTTPS 访问形式的Docker Registry的过程,读者很容易复现的过程!

我的环境是CentOS7_x64,Docker版本是 Client: Docker Engine - Community 19.03.7、Server: Docker Engine - Community 19.03.7、Nginx源码包的版本是nginx-1.9.9.tar.gz。

阅读更多...

Java的四种引用

mark

在Java语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握Java对象生命周期和JVM内部相关机制非常有帮助。本文讲述了强引用、软引用、弱引用、幻象引用的区别以及一些具体使用场景,而且是配合ReferenceQueue使用。

阅读更多...

请丢弃finalize

用过JDK9的同学应该发现了,finalize方法在JDK9中已经被标记为deprecated,今天探讨一下finalize方法。如果没有特别的原因,不要实现finalize方法,也不要指望利用它来进行资源回收。因为你无法保证finalize什么时候执行,执行的是否符合预期。使用不当会影响性能,导致程序死锁、挂起等。

阅读更多...

9种垃圾收集器

mark

目前的垃圾收集器主要有7种,上图是他们的使用关系,连在一起的就可以配合使用。JDK11出现两种新的垃圾收集器,一个是Epsilon垃圾收集器,一个是ZGC垃圾收集器。垃圾收集器中很重要的两个概念:Stop-The-World和Safepoint。首先说说Stop-The-World:JVM由于要执行GC而停止了应用程序的执行,任何一种GC算法中都会发生。多数GC优化通过减少Stop-the -world发生的时间来提高程序性能。安全点 Safepoint:分析过程中对象引用关系不会发生变化的点,产生Safepoint的地方:方法调用、循环跳转、异常跳转等,安全点数量得适中。

阅读更多...

Java内存模型的回顾

mark

本篇文章主要讲述了Java内存模型中的程序计数器、虚拟机栈、本地方法栈、元空间与堆,以及堆中的常量池。前面通过javap反编译class文件得到int add(int a, int b)函数的栈帧,主要分析了栈帧中JVM指令对应的局部变量表、操作数栈、程序计数器的状态变化。以及JDK7以后出现了替代永久代的元数据区,并分析了元数据区替换了永久代有哪些好处,主要分析了给字符串常量池带来的影响,并通过代码验证了元数据区相比永久代的优越性。学习了JVM性能调优的三个参数的意义和普通用法,最后探讨了并验证了JDK1.6与JDK1.7+的版本String类的intern方法的不同表现结果,分析了出现不同结果的原因,其实主要是JDK1.6的版本是建立副本再放入字符串常量池,而JDK1.7+版本时直接把堆上的对象的引用入池。

阅读更多...

ClassLoader

mark

ClassLoader在Java中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二进制数据流。它是Java的核心组件。所有的Class都是由ClassLoader 进行加载的。ClassLoader负责通过将Class文件里的二进制数据流装载进系统,然后交给Java虚拟机进行连接、初始化等操作。

阅读更多...
  • © 2018-2020 changlin zou
    • Page View:
    • Unique Visitor:

请我喝杯咖啡吧~

支付宝
微信