
底层
jacljh
程序匠人
展开
-
Java线程之间通信方式
通信方式: 1.同步 a.同步是指多个线程之间通过synchronize关键字这种方式来实现线程间的通讯。 b.这种方式本质上就是共享内存式的通讯。多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行。 2.while轮询的方式 a.这种方式比较浪费资源,是因为JVM將调度器交给轮询线程执行时,它只是在不断地测试...原创 2019-12-31 11:02:23 · 373 阅读 · 0 评论 -
类加载流程
当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化三个步骤对该类进行类加载。1、加载 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象。类的加载过程是由类加载器来完成,类加载器由JVM提供。我们开发人员也可以通过继承ClassLoader来实现自己的类加载器。 1.1、加载的class来源 ...原创 2019-12-30 18:56:45 · 339 阅读 · 0 评论 -
集合简述
Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程安全,效率低 LinkedList ...原创 2018-07-22 22:40:21 · 232 阅读 · 0 评论 -
使用StringUtils.isNumeric(String str) 判断string是否为数字
< P>检查字符串是否只包含Unicode数字。*小数点不是Unicode数字,返回false。</P><p> <代码> null <代码>将返回 false 。*空字符串(“”)将返回 true </p>方法实现:StringUtils.class * <pre> * Str...原创 2018-10-17 13:24:11 · 23489 阅读 · 1 评论 -
正则表达式 - - java.util.regex 包 (二)
java.util.regex 包主要包括以下三个类: Pattern 类: pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。 Matcher 类: Matcher 对象是对输入字符串进行解释和匹配...原创 2018-10-22 11:41:30 · 146 阅读 · 0 评论 -
正则表达式 - - Pattern 和 Matcher 类 (三)
一、Pattern类Pattern类中有两个最常用的方法:(1)boolean isMatch = Pattern.matches("regExp", "string");matches()方法表示正则表达式regExp是否匹配字符串string,匹配返回true,不匹配返回false注意:String类也有matches()方法,如"abcd".matches(regExp),其实...原创 2018-10-22 11:45:54 · 186 阅读 · 0 评论 -
Java程序为何“编译一次,到处运行”
与其他语言相比,Java程序能够做到“编译一次,到处运行”,可见它的跨平台性非常强。但是java的这种跨平台到底是怎么一回事啊,在这之前我们先了解一下不能跨平台是怎么一回事。 C或者C++等高级语言,是贴近于人类可阅读的语言,比较接近于英语语法。但是计算机只识别0、1序列组成的机器指令。所以要把C或者C++语言翻译成计算机能识别的0、1序列组成的机器指令。担任这种翻译工作的就是...转载 2018-11-03 22:58:51 · 822 阅读 · 0 评论 -
深入分析Java方法反射的实现原理
前段时间看了笨神的从一起GC血案谈到反射原理一本,就把Java方法的反射机制实现撸了一遍。方法反射实例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class ReflectCase { pub...转载 2018-11-04 18:33:55 · 141 阅读 · 0 评论 -
深入理解java反射机制
一,java的核心机制java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection):Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在其上面运行Java代码编译后的字节码程序,java虚拟机实现了平台无关性。Java垃圾回收(Garbage Collection):自动释放不用对象内...转载 2018-11-05 10:37:13 · 127 阅读 · 0 评论 -
Spring Cloud底层原理
概述毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。实际上,Spring Cloud是一个全家桶式的技术栈,包含了很多组件。本文先从其最核心的几个组件入手,来剖析...原创 2018-11-10 23:12:14 · 313 阅读 · 0 评论 -
java虚拟机内存区域的划分以及作用详解
一、运行时数据区 什么叫运行时数据区呢,看下图就知道了,今天的重点就围绕这张图讲。 1、程序计数器(寄存器) 当前线程所执行的字节码行号指示器 字节码解释器工作依赖计数器控制完成 通过执行线程行号记录,让线程轮流切换各条线程之间计数器...转载 2018-11-06 20:40:29 · 138 阅读 · 0 评论 -
Java内存溢出问题总结
使用Java那么久,在此总结一下Java中常见的内存溢出问题以及对应的解决思路堆溢出报错信息java.lang.OutOfMemoryError: Java heap space报错原因堆中(新生代和老年代)无法继续分配对象了; 某些对象的引用长期被持有没有被释放,垃圾回收器无法回收; 使用了大量的 Finalizer 对象,这些对象并不在 GC 的回收周期内。解决办法...转载 2018-11-08 10:05:15 · 176 阅读 · 0 评论 -
生产环境的tomcat调优和jvm调化
Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你。对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU 的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,CPU 的处理能力越强,系统运行速度越快。Tomcat 的优化不像其它软件那样,简简单单的修改几个参数就可以了,它的优化主要有三方面...转载 2018-11-08 10:41:17 · 172 阅读 · 0 评论 -
天猫技术部Java开发三面题目
天猫双11成交再次刷新了新的世界记录2135亿,我们一起来看看天猫Java开发技术部的三面题目。 01—天猫一面 介绍自己,项目 线程创建方式、线程池、哪些参数?饱和策略? 哪些设计模式?Java里面用到了哪些设计模式?了解动态代理模式么? spring用到的设计模式? 一次web请求响应中,那个部分最耗时,tcp握手?业务逻...转载 2018-11-12 20:44:14 · 1047 阅读 · 0 评论 -
深入分析ThreadLocal
我们在使用一个类时,首先要知道它能做什么,然后再去深入分析它的工作原理。ThreadLocal如果从名字上来看像是“本地线程"的意思,其实ThreadLocal并不是一个线程,而是线程的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。在Java多线程面试题中...转载 2018-11-20 21:49:47 · 226 阅读 · 0 评论 -
内存泄漏和内存溢出
1、内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。2、内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。...转载 2018-11-20 22:09:25 · 237 阅读 · 0 评论 -
Java 序列化与反序列化理解
(Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。)Java 序列化Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象...原创 2018-12-04 15:04:56 · 174 阅读 · 0 评论 -
学习 MySQL优化原理
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必。因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用。MySQL逻辑架构如果能在头脑中构建一幅M...转载 2018-11-30 16:09:00 · 175 阅读 · 0 评论 -
反射
1.什么是反射简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。简单的来说就是两点,在运行期间:1、对于任意一个类,都能够知道这个类的所有属性和方法2、对于任意一个类,都能够调用它的任意一个属性和方法2.反射的作用。为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概...转载 2019-01-18 22:38:41 · 124 阅读 · 0 评论 -
Java虚拟机1:开篇
1.前言由于后期学习需要用到大量的JVM底层的东西,所有本人调整了一下学习计划,打算先从JVM入手,了解整个JAVA的运行机制,内存模型,编译原理等等一些底层的东西,这样在学习 后面的东西,会有一种豁然开朗的感觉。后期的内容有从网上直接复制粘贴的内容,但是大部分的内容都是经过自己整理后的,我觉得参照别人写的东西,未尝不可。如果是转载的文章,最后我列出转载的地址。虽然我做不了技术的创造者,但是争...转载 2019-01-19 07:07:32 · 282 阅读 · 0 评论 -
Java虚拟机2:Java内存区域
1.几个计算机的概念为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念。1、计算机存储单位从小到大依次为位Bit、字节Byte、千字节KB、兆M、千兆GB、TB,相邻单位之间都是1024倍,1024为2的10次方,即:1Byte= 8bit 1K = 1024Byte 1M = 1024K 1G = 1024M 1T = 1024G2、计...转载 2019-01-19 07:21:43 · 142 阅读 · 0 评论 -
Java虚拟机3:内存溢出
1.前言上一篇我们介绍了java的内存区域结构,这一篇,模拟内存溢出的几个场景,下面一个图是总体的指导思想:2.Java堆溢出Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了。所以测试的时候把堆的大小固定住并且让堆不可扩展即可。测试代码如下: 1 package com.xrq.test;...转载 2019-01-19 07:50:21 · 212 阅读 · 0 评论 -
Java虚拟机4:Java对象创建和对象访问
1.对象创建Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(克隆、反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此。看一下在虚拟机层面上创建对象的步骤:对象的建立过程 图一:对象建立过程1、类加载检查。当JVM检测到有一条new指令时,首先先检查该指令的参数是否在常量池中定位到一个类...转载 2019-01-19 08:08:08 · 206 阅读 · 0 评论 -
Java虚拟机5:常用JVM命令参数
这里汇总一些平时用到的、看到的一些虚拟机参数:(1)-Xms20M表示设置堆容量的最小值为20M,必须以M为单位(2)-Xmx20M表示设置堆容量的最大值为20M,必须以M为单位。将-Xmx和-Xms设置为一样可以避免堆自动扩展。大的项目-Xmx和-Xms一般都要设置到10G、20G甚至还要高(3)-verbose:gc表示输出虚拟机中GC的详细情况(4)-Xss128...转载 2019-01-19 08:44:54 · 251 阅读 · 0 评论 -
Java虚拟机6:垃圾收集(GC)-1(内存溢出和内存泄漏的区别)
1.前言在进行垃圾收集之前需要普及几个比较重要的概念。2.内存溢出和内存泄露的概念和区别:(1):内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间可以分配,系统不能满足需求,出现了out of memory;比如申请了一个int,但是它存了long才能存下的数,那就是内存溢出。(2):内存泄露(memory leak):是指程序在申请内存之后,无法释...转载 2019-01-19 08:47:04 · 243 阅读 · 0 评论 -
Java虚拟机7:垃圾收集(GC)-2(并行和并发的区别)
1.并发编程下这两个名词都是并发编程中的概念,在并发编程的模型下的定义:并发:是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序。 并行:是多个或同时一个cpu上,每个cpu运行一个程序。打个比方,并发,就像一个人(cpu)喂2个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。并行,就是2个人喂2个孩子,两个孩子也同时在吃饭。...转载 2019-01-19 12:59:55 · 204 阅读 · 0 评论 -
Java虚拟机8:垃圾收集(GC)-3(垃圾收集算法)
1.垃圾对象的判断Java堆中存放着几乎所有的对象实例,垃圾收集器对堆中的对象进行回收前,要先确定这些对象是否还有用,判定对象是否为垃圾对象有如下算法:(1):引用计数算法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器都为0的对象就是不可能再被使用的。 引用计数算法的实现简单,判定效率也很高,在大部分...转载 2019-01-19 13:02:07 · 223 阅读 · 0 评论 -
Java虚拟机9:垃圾收集(GC)-4(垃圾收集器)
1.前言垃圾收集器是前一章垃圾收集算法理论知识的具体实现了,不同虚拟机所提供的垃圾收集器可能会有很大差别,另外我们必须提前说明一个道理:没有最好的垃圾收集器,更加没有万能的收集器,只能选择对具体应用最合适的收集器。这也是HotSpot为什么要实现这么多收集器的原因,下面我们以HotSpot为例讲解。在写之前,先介绍几个概念。1.1.并行和并发的区别这个区别之前在你专门的一节介绍过,这里...转载 2019-01-19 14:51:19 · 197 阅读 · 0 评论 -
Java虚拟机10:Client模式和Server模式的区别
部分商用虚拟机中,Java程序最初是通过解释器对.class文件进行解释执行的,当虚拟机发现某个方法或代码块运行地特别频繁的时候,就会把这些代码认定为热点代码Hot Spot Code(这也是我们使用的虚拟机HotSpot名称的由来)。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器叫做即时编译器(Just In T...转载 2019-01-19 15:04:06 · 3055 阅读 · 0 评论 -
java动态代理的实现以及原理
1.前言之前对动态代理的技术只是表面上理解,没有形成一个体系,这里总结一下,整个动态代理的实现以及实现原理,以表述的更清楚一些。2.动态代理的实现应用到的技术1、动态编译技术,可以使用Java自带的JavaCompiler类,也可以使用CGLIB、ASM等字节码增强技术,Java的动态代理包括Spring的内部实现貌似用的都是这个2、反射,包括对于类.class和getClass(...转载 2019-01-14 18:06:47 · 244 阅读 · 0 评论 -
cloneable接口
1.为什么需要克隆?在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的,要满足这种需求有很多途径。看例子: 1 2 3 ...原创 2019-01-14 17:07:41 · 175 阅读 · 0 评论 -
Java虚拟机11:内存分配原则
前言JVM的自动内存管理要自动化的解决两个问题:对象分配内存以及回收分配给对象的内存。对象的内存分配一般是指在堆上分配,少数情况下也可能会直接分配在老年代上,对象主要分配在新生代的Eden 区上,如果启动了本地线程分配缓存,将按线程优先在TLAB (本地线程分配缓存)上分配。分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数。垃圾收...转载 2019-01-20 11:42:18 · 360 阅读 · 0 评论 -
Java虚拟机12:虚拟机性能监控与故障处理工具
前言定位系统问题的时候,知识、经验是基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照、堆转储快照等。经常使用适当的虚拟机监控和分析的工具可以加快分析数据、定位解决问题的速度。jps:虚拟机进程状况工具首先约定一下运行的代码都是以下这段 1 public class TestMain 2 { 3 pu...转载 2019-01-20 11:54:52 · 183 阅读 · 0 评论 -
Java虚拟机13:Java类加载机制
前言我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用。而虚拟机如何加载这些.class文件?.class文件的信息进入到虚拟机后会发生什么变化?这些都是本文要讲的内容,文章将会讲解加载类加载的每个阶段Java虚拟机需要做什么事(加粗标红)。类使用的7个阶段类从被加载到虚拟机内存中开始,到卸载出内存...转载 2019-01-20 12:10:46 · 156 阅读 · 0 评论 -
Java虚拟机14:类加载器
类与类加载器虚拟机设计团队把类加载阶段张的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为"类加载器"。类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限定于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每...转载 2019-01-20 12:31:52 · 219 阅读 · 0 评论 -
Java虚拟机15:运行期优化
前言HotSpot采用的是解释器+编译器并存的架构,之前的这篇文章里面已经讲过了,本文只是把即时编译器这块再讲得具体一点而已。当然,其实本文的内容也没多大意义,90%都是概念上的东西,对于实际开发、实际解决项目里面的疑难问题并没有什么太大的帮助,只要看过就好了。编译对象与触发条件之前讲过,Sun使用的虚拟机之所以被叫做"HotSpot",就是因为运行过程中会检测热点代码,那么运行...转载 2019-01-20 23:20:05 · 140 阅读 · 0 评论 -
Java虚拟机16:Java内存模型
什么是Java内存模型Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常,而在另外一套平台上并发访问...转载 2019-01-20 23:23:33 · 185 阅读 · 0 评论 -
Java虚拟机17:互斥同步、锁优化及synchronized和volatile
互斥同步互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保证手段。同步是指子啊多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一个(或者是一些,使用信号量的时候)线程使用。而互斥是实现同步的一种手段,临界区(Critial Section)、互斥量(Mutex)和信号量(Semaphore)都是主要的互斥实现方式。因此,在这...转载 2019-01-20 23:25:45 · 250 阅读 · 0 评论 -
Java虚拟机18:Java对象大小、对象内存布局及锁状态变化
一个对象占多少字节?关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法。不过还好,在JDK1.5之后引入了Instrumentation类,这个类提供了计算对象内存占用量的方法。至于具体Instrumentation类怎么用就不说了,可以参看这篇文章如何精确地测量java对象的大小。不过有一点不同的是,这篇文章使用命令行传入JVM参数来...转载 2019-01-20 23:28:03 · 185 阅读 · 0 评论 -
Java虚拟机19:再谈四种引用状态
JVM的四种引用状态在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深。这两天重看虚拟机这部分的时候,写了很多例子详细研究了一下JVM的几种引用,对于JVM的引用理解加深了不少,因此总结写一篇文章总结并分享下。首先,还是先从JVM四种引用状态开始,这部分摘抄自周志明老师的《深入理解Jav...转载 2019-01-20 23:59:19 · 214 阅读 · 0 评论