精华内容
下载资源
问答
  • 一个很不错的java技术分享网站
    更多相关内容
  • Java虚拟机内存模型 Java虚拟机内存模型中定义的访问操作与物理计算机处理的基本一致! Java中通过多线程机制使得多个任务同时执行处理,所有的线程共享JVM内存区域main memory,而每个线程又单独的有自己的工作...

    Java虚拟机内存模型

    Java虚拟机内存模型中定义的访问操作与物理计算机处理的基本一致!

    Java中通过多线程机制使得多个任务同时执行处理,所有的线程共享JVM内存区域main memory,而每个线程又单独的有自己的工作内存,当线程与内存区域进行交互时,数据从主存拷贝到工作内存,进而交由线程处理(操作码+操作数)。更多信息我们会在后面的《深入JVM—JVM类执行机制中详细解说》。

    在之前,我们也已经提到,JVM的逻辑内存模型如下:

    我们现在来逐个的看下每个到底是做什么的!

    1、程序计数器

    程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

    由于Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

    如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie 方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError 情况的区域。

    2、Java 虚拟机栈

    与程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame ①)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

    经常有人把Java 内存区分为堆内存(Heap)和栈内存(Stack),这种分法比较粗糙,Java 内存区域的划分实际上远比这复杂。这种划分方式的流行只能说明大多数程序员最关注的、与对象内存分配关系最密切的内存区域是这两块。其中所指的“堆”在后面会专门讲述,而所指的“栈”就是现在讲的虚拟机栈,或者说是虚拟机栈中的局部变量表部分。

    局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress 类型(指向了一条字节码指令的地址)。

    其中64 位长度的long 和double 类型的数据会占用2 个局部变量空间(Slot),其余的数据类型只占用1 个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

    在Java 虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;如果虚拟机栈可以动态扩展(当前大部分的Java 虚拟机都可动态扩展,只不过Java 虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存时会抛出OutOfMemoryError 异常。

    3、本地方法栈

    本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot 虚拟机)直接就把本地方法栈和虚拟机栈合二为一。

    与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError 和OutOfMemoryError异常。

    4、Java 堆

    对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java 虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配①,但是随着JIT 编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换②优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。

    Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”(GarbageCollected Heap,幸好国内没翻译成“垃圾堆”)。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java 堆中还可以细分为:新生代和老年代;再细致一点的有Eden 空间、From Survivor 空间、To Survivor 空间等。如果从内存分配的角度看,线程共享的Java 堆中可能划分出多个线程私有的分配缓冲区(Thread LocalAllocation Buffer,TLAB)。不过,无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存。在本章中,我们仅仅针对内存区域的作用进行讨论,Java 堆中的上述各个区域的分配和回收等细节将会是下一章的主题。

    根据Java 虚拟机规范的规定,Java 堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms 控制)。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError 异常。

    4、方法区

    方法区(Method Area)与Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区分开来。

    对于习惯在HotSpot 虚拟机上开发和部署程序的开发者来说,很多人愿意把方法区称为“永久代”(Permanent Generation),本质上两者并不等价,仅仅是因为HotSpot 虚拟机的设计团队选择把GC 分代收集扩展至方法区,或者说使用永久代来实现方法区而已。对于其他虚拟机(如BEA JRockit、IBM J9 等)来说是不存在永久代的概念的。即使是HotSpot 虚拟机本身,根据官方发布的路线图信息,现在也有放弃永久代并“搬家”至Native Memory 来实现方法区的规划了。

    Java 虚拟机规范对这个区域的限制非常宽松,除了和Java 堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是有必要的。在Sun 公司的BUG 列表中,曾出现过的若干个严重的BUG 就是由于低版本的HotSpot 虚拟机对此区域未完全回收而导致内存泄漏。

    根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。

    5、运行时常量池

    运行时常量池(Runtime Constant Pool)是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant PoolTable),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

    Java 虚拟机对Class 文件的每一部分(自然也包括常量池)的格式都有严格的规定,每一个字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。但对于运行时常量池,Java 虚拟机规范没有做任何细节的要求,不同的提供商实现的虚拟机可以按照自己的需要来实现这个内存区域。不过,一般来说,除了保存Class 文件中描述的符号引用外,还会把翻译出来的直接引用也存储在运行时常量池中①。

    运行时常量池相对于Class 文件常量池的另外一个重要特征是具备动态性,Java 语言并不要求常量一定只能在编译期产生,也就是并非预置入Class 文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String 类的intern() 方法。

    既然运行时常量池是方法区的一部分,自然会受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError 异常

    6、直接内存

    直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError 异常出现,所以我们放到这里一起讲解。

    在JDK 1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用Native 函数库直接分配堆外内存,然后通过一个存储在Java 堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java 堆和Native 堆中来回复制数据。

    显然,本机直接内存的分配不会受到Java 堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括RAM 及SWAP 区或者分页文件)的大小及处理器寻址空间的限制。服务器管理员配置虚拟机参数时,一般会根据实际内存设置-Xmx等参数信息,但经常会忽略掉直接内存,使得各个内存区域的总和大于物理内存限制(包括物理上的和操作系统级的限制),从而导致动态扩展时出现OutOfMemoryError异常

    逻辑内存模型我们已经看到了,那当我们建立一个对象的时候是怎么进行访问的呢?在Java 语言中,对象访问是如何进行的?对象访问在Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及Java 栈、Java 堆、方法区这三个最重要内存区域之间的关联关系,如下面的这句代码:

    Object obj = new Object();

    假设这句代码出现在方法体中,那“Object obj”这部分的语义将会反映到Java 栈的本地变量表中,作为一个reference 类型数据出现。而“new Object()”这部分的语义将会反映到Java 堆中,形成一块存储了Object 类型所有实例数据值(Instance Data,对象中各个实例字段的数据)的结构化内存,根据具体类型以及虚拟机实现的对象内存布局(Object Memory Layout)的不同,这块内存的长度是不固定的。另外,在Java 堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。

    由于reference 类型在Java 虚拟机规范里面只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到Java 堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同,主流的访问方式有两种:使用句柄和直接指针。

    句柄池

    如果使用句柄访问方式,Java 堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息,如下图所示。

    如果使用直接指针访问方式,Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference 中直接存储的就是对象地址,如下图所示

    这两种对象的访问方式各有优势,使用句柄访问方式的最大好处就是reference 中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference 本身不需要被修改。

    使用直接指针访问方式的最大好处就是速度更快,它节省了一次指针定位的时间开销,由于对象的访问在Java 中非常频繁,因此这类开销积少成多后也是一项非常可观的执行成本。就本书讨论的主要虚拟机Sun HotSpot 而言,它是使用第二种方式进行对象访问的,但从整个软件开发的范围来看,各种语言和框架使用句柄来访问的情况也十分常见。

    下面我们来看几个示例

    1、Java 堆溢出

    下面的程中我们限制Java 堆的大小为20MB,不可扩展(将堆的最小值-Xms 参数与最大值-Xmx 参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError 可以让虚拟机在出现内存溢出异常时Dump 出当前的内存堆转储快照以便事后进行分析。

    参数设置如下

    最后

    提供一下免费的Java架构学习资料给大家,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

    需要的朋友可以戳这里免费领取

    还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
    ip204888/java-p7)**

    还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
    在这里插入图片描述

    展开全文
  • Java每日分享

    2019-08-02 09:57:10
    文章目录一、转义字符二、...​ 有一些符号在java中有特殊的作用,转义字符从\开始 ​ \b 退格 ​ \n 换行 ln ​ \r 光标回到行首 ​ \t 制表符 一个汉字占2个空格,一个字母占1个空 一个制表符位8个空格 二、进制...

    一、转义字符

    ​ 有一些符号在java中有特殊的作用,转义字符从\开始

    ​ \b 退格
    ​ \n 换行 ln
    ​ \r 光标回到行首
    ​ \t 制表符 一个汉字占2个空格,一个字母占1个空 一个制表符位8个空格

    二、进制

    ​ 1)二进制:

    ​ 只能有0,1组成 前面 0b开头

    ​ 2)八进制:

    ​ 只能有0~7数字组成 以0开头
    ​ 3)十进制:

    ​ 默认十进制
    ​ 4)十六进制:

    ​ 09,af组成 以0x开头,大小写都可以

    ​ 其他进制转十进制: 从后往前,从最后一位开始*当前的进制数^0(次方从0开始,每次加一),最后求和
    ​ 十进制转为其他进制:使用这个数一致除以进制数,看余数

    三、运算符

    1)算数运算符:

    ​ 加 + ;减 - ;乘 *;除 / ;取余 %

    2)赋值运算符:

    ​ “=” 注意赋值运算是从右往左运行

    ​ (扩展) 自增 += ;自减 -=;自乘 *=;自除 /=;自余 %=

    3)比较运算符:

    ​ 大于 >;小于 <;大于等于 >=;小于等于 <=;不等于 !

    ​ 最终的结果肯定为boolean类型的结果

           // 比较2个数的大小 ,结果最大的数
    		int a = 10;
            int b = 20;
            int result = a > b ? a : b;
            System.out.println("最大值为:" + result);
    
    4)逻辑运算符:

    ​ 操作数要求都要值值为boolean类型的表达式
    ​ &与 :两个都为true才是true,一个为false就是false
    ​ |或 :一个为true就是true,两个都是false才是false
    ​ !非 :取反 !true–>false !false–>true
    ​ ^ :相同为false,不同为true

    		int a=10;
    		int b=9;
    		System.out.println(a>b & ++b>a);  // true
    		System.out.println("a="+a+",b="+b);  // a=10,b=10
    		System.out.println(a<b | b<a);    // false
    		System.out.println(!(a>b ^ a>9)); // false
    

    短路:第一个操作数就已经能够决定最终的结果了,第二个操作数将不再执行(推荐使用)

    ​ &&:前面判断为false,后面不再运行
    ​ || :前面判断为true,后面不再运行

    5)条件运算符:

    ​ 条件表达式 ? 值1 : 值2;
    ​ 1)执行条件表达式–>值为boolean类型的表达式
    ​ 2)如果为true,最终的结果取值1
    ​ 3)如果为false,最终的结果取值2

    		// 比较一个数是否为偶数/奇数
            String str =  a % 2 == 0? "a是偶数":"a是奇数";
            System.out.println(str);
    
    		// 比较3个数的大小,求最大的数
    		int a = 10;
    		int b = 20;
            int c = 30;
            result = c > (a > b ? a : b) ? c : (a > b ? a : b);
            System.out.println("最大值为:" + result);
    

    6)位运算符
    ​ 所有的 操作数先转为二进制的形式参与运算,再把结果转为十进制的形式

    ​ & :同一位置的两个数,一个0就是0,两个都1才是1
    ​ | :同一位置的两个数,一个为1就是1,两个都为0才是0
    ​ ^ :相同为0,不同为1
    ​ 位移运算符
    ​ 左移:<< 二进制的操作数,向左移动第二个操作数的位数,空余的位置补0,得到的结果转为十进制
    ​ -->第一个操作数*2的第二个操作数次方
    ​ 右移:>> 二进制的操作数,向右移动第二个操作数的位数,分水岭右侧的结果不要,只保留左侧,结果转为十进制
    ​ -->第一个操作数/2的第二个操作数次方

    四、Scanner类:

    可以接收键盘输入的内容
    ​ 1)导包:指明Scanner类的位置
    ​ import +包名+类名; import java.util.Scanner;
    ​ 位置:类的上面
    ​ 2)创建某个类型的变量|引用
    ​ Scanner sc=new Scanner();
    ​ 3)引用.功能名字();
    ​ next() 接收字符串 结束功能:enter,不会接收enter
    ​ 从有效字符开始接收,遇到空格,tab不接受了,但是必须遇到enter结束功能
    ​ nextLine() 只要没有换行,都能接收 遇到enter结束功能,接收enter
    ​ nextInt()
    ​ nextByte()
    ​ nextShort()
    ​ nextDouble()…
    ​ 4)引用.close();
    注意:一定在一个类中使用完毕以后再关闭,否则重新开启也无法使用

    五、Random:

    产生伪随机数
    ​ 1)导包 import java.util.Random;
    ​ 2)创建Random类型的变量|引用
    ​ 3)引用.功能名字()
    ​ nextInt() 产生一个int范围内的随机整数
    ​ nextInt(n) 产生0~n随机整数 [0,n)
    ​ [0,max] 引用.nextInt(max+1)
    ​ [min,max] 引用.nextInt(max-min+1)+min

    六、流程控制语句

    ​ 顺序结构:从上倒下,从左到右
    ​ 选择结构:根据选择,决定执行的内容
    ​ 循环结构:重复执行某些内容
    if…else
    ​ 1)单分支|单选泽
    ​ if(条件表达式){
    ​ 语句体;
    ​ }
    ​ 条件表达式必须值为boolean类型的表达式
    ​ 如果条件表达式结果为false,就不执行跳过整个if结构
    ​ 如果条件表达式结果为true,执行{}中的语句体

    ​ 2)双分支|双选择
    ​ if(条件表达式){
    ​ 语句体1;
    ​ }else{
    ​ 语句体2;
    ​ }
    ​ 无论是否满足条件,都会执行语句体

    ​ 3)多分支|多选择:
    ​ if(条件表达式1){
    ​ 语句体1;
    ​ }else if(条件表达式2){
    ​ 语句体2;
    ​ }else if(条件表达式3){
    ​ 语句体3;
    ​ }
    ​ …
    ​ else{
    ​ 以上条件都不满足执行的内容
    ​ }

    if语句和条件运算符之间的选择:
    ​ 1.条件运算符肯定会得到结果
    ​ 2.麻烦的使用if,简单的能使用条件运算符就是用条件运算符

    switch语句:定值判断
    ​ switch(表达式){
    ​ case 值1:
    ​ 语句体1;
    ​ break;
    ​ case 值2:
    ​ 语句体2;
    ​ break;
    ​ …
    ​ default:
    ​ 语句体n;
    ​ break;
    ​ }
    ​ 表达式|变量: byte,short,int,char,枚举(1.5),字符串(1.7)
    ​ case:拿表达式的结果与case后的值进行判断,如果相同,执行对应的语句体;
    ​ break:结束这个switch语句,如果没有break会发生case穿透
    ​ default: else作用一致,以上case都不满足条件,执行default中的语句体
    ​ 可以在switch语句中的任何位置,改变位置注意break的问题

    nt,char,枚举(1.5),字符串(1.7)
    ​ case:拿表达式的结果与case后的值进行判断,如果相同,执行对应的语句体;
    ​ break:结束这个switch语句,如果没有break会发生case穿透
    ​ default: else作用一致,以上case都不满足条件,执行default中的语句体
    ​ 可以在switch语句中的任何位置,改变位置注意break的问题

    if语句可以做区间判断,可以做定值判断,switch 只能做定值判断

    展开全文
  • zlib库用于对HTTP包的内容做gzip 【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】 浏览器打开:qq.cn.hn/FTf 免费领取 格式的压缩,如果我们在nginx.conf里配置了gzip on, 并指定...

    第一种安装方式

    ======================================================================

    官方指引安装的方式

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    注意:

    在这里插入图片描述

    安装完成:

    在这里插入图片描述

    启动:直接输入 nginx 即可

    在这里插入图片描述

    浏览器中访问测试:默认端口80

    在这里插入图片描述

    这样就安装成功了,那么nginx安装的相关文件放置在哪了呢?比如 nginx.conf配置文件以及对于的启动文件在哪儿呢?

    | 文件 | 目录 |

    | :-- | :-- |

    | nginx.conf配置文件(安装目录) | /etc/nginx/nginx.conf |

    | Nginx启动脚本 | /etc/sysconfig/nginx |

    | Nginx log目录 | /var/log/nginx |

    | Nginx pid文件 | /var/run/nginx.pid |

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    第二种安装方式

    ======================================================================

    上面介绍的是通过yum源来安装的,也是官方推荐的方式,安装简单,但是对于安装的版本选择不够灵活,在实际工作中我们可能需要安装特定的版本的Nginx,接下来我们就介绍下这种方式:

    安装软件:可以直接下载,或者通过wget来下载

    wget http://nginx.org/download/nginx-1.14.0.tar.gz

    在这里插入图片描述

    解压缩文件:

    tar -zxvf nginx-1.14.0.tar.gz

    在这里插入图片描述

    进入解压缩的文件夹中

    ./configure --prefix=path

    如果不加—prefix的话,默认会安装到/usr/local/nginx目录下

    在这里插入图片描述

    操作可以遇到的报错,如果要使用Nginx的常用功能,那么首先需要确保该操作系统上至少安装了如下软件

    GCC编译器可以用来编译C语音程序,因为Nginx是C语音开发的,所以我们在安装的时候需要GCC的支持

    PCRE库:是一个函数库,目前为很多软件所使用,该库支持正则表达式,如果我们在配置文件nginx.conf里使用了正则表达式,

    那么在编译Nginx时就必须把PCRE 库编译进Nginx,因为Nginx的HTTP模块要靠它来解析正则表达式

    pcre-devel是使用PCRE做二次开发时所需要的开发库,包括头文件等,这也是编译Nginx 所必须使用的!

    zlib库用于对HTTP包的内容做gzip

    【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
    
    浏览器打开:qq.cn.hn/FTf 免费领取
    

    格式的压缩,如果我们在nginx.conf里配置了gzip on,

    并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量,那么,在编译时就必须把zlib编译进Nginx。

    同理,zlib是直接使用的库,zlib-devel是二次开发所需要的库。

    展开全文
  • Java语言每日一练—第11天:最优选择2

    多人点赞 热门讨论 2022-05-02 17:43:28
    系列专栏:《Java每日一练》 首发时间:2022年5月2日 ❤:热爱Java学习,期待一起交流! 作者水平有限,如果发现错误,求告知,多谢! 有问题可以私信交流!!! 导航小助手 目录 ☆引言☆ 练习题:最优...
  • 定时任务实现哔哩哔哩(Bilibili)每日自动投币,点赞,分享视频,直播签到,银瓜子兑换硬币,漫画每日签到,简单配置即可每日轻松获取 65 经验值,快来和我一起成为 Lv6 吧~~~~ 功能列表 本项目不会增加类似于自动...
  • 在oracle用户执行./runInstaller进入图形化界面安装数据库时 进入图形化界面报错: INS-10102 : Installer initialization failer INS-10012 : Setup driver initialization failed...详细原因为:“java.lang.Unsat
  • 需要首先使用签名认证,认证后才能分享,按照微信官网api,首先需要获取token,然后再根据token获取jsapiticket,然后再将随机数、时间戳、url等按照keyvalue排序加密去认证,java后端实现了下,分享下代码,给需要...
  • here is a problem with javavm component and database upgrade cannot be performed until it is corrected. error: ora-29516 jol.c:11157。。。 JAVAVM COMPONENT MUST BE FUNCTIONING PROPERLY BEOFER ...
  • Java&Android技术分享

    2017-12-12 11:12:46
    http://www.importnew.com/
  • Java语言每日一练—第12天:求一个数的绝对值

    多人点赞 热门讨论 2022-05-02 17:58:22
    系列专栏:《Java每日一练》 首发时间:2022年5月3日 ❤:热爱Java学习,期待一起交流! 作者水平有限,如果发现错误,求告知,多谢! 有问题可以私信交流!!! 导航小助手 目录 ☆引言☆ 练习题:求...
  • 分享一个java技术开发的微信答题小程序仿头脑王者源码发布时间:2020-06-11 21:24:10来源:51CTO阅读:324作者:suncent2019分享一个java技术开发的仿头脑王者源码答题小程序,工程师发现,目前市面上的答题小程序均...
  • 点击上方石杉的架构笔记,右上角选择“设为星标”每日早8点半,技术文章准时送上公众号后台回复“学习”,获取作者独家秘制精品资料往期文章BAT 面试官是如何360°无死角考察...
  • 面试题2:分布式锁在项目中有哪些应用场景 面试题3:分布式锁有哪些解决方案 每日小结   本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等...
  • java互联网面试题整理

    2020-12-31 15:00:46
    整理互联网常见面试题,为春招、校招和社招做准备。如若不能下载,关注公众号“每日技术分享”,可免费下载资源。
  • 其中有一个操作是:为企业用户开启一个定时任务,根据企业录用的用人条件,每日匹配一定数量的应聘者“投递”到企业的资源池中去,那么系统在将匹配到的应聘者投递到资源池的时候需要先检查:此时应聘者默认简历的...
  • java源码 开源项目介绍 1、省钱兄(微信小程序、h5版本)淘宝客源码商城前端源码友盟统计 2、地摊兄(微信小程序、h5版本)地摊经济地摊商城源码京东客源码 3、省钱兄(APP+H5+公众号)淘宝客源码社交电商源码分销...
  • 2018年 每日分享一个技术

    千次阅读 2018-01-30 08:32:39
    Java进阶篇(五)——Java的I/O技术   2018-01-30 15:53   (未验证) JDK1.8]JDK1.8集合源码阅读——Set汇总     2018-02-04 11:19  (未验证)   JDK 10 本周将进入候选发布阶段,新特性抢先看 ...
  • 一: 前言 秋招将至,特意整理了之前面试过的题目分享出来,坚持每日学习、打卡,秋招Offer满满! 题目会持续更新,且保证有质量,期待你的参与,一起打卡,一起进步! 二: 面试题目 一: 什么是乐观锁和悲观锁,可以举例说说? ...
  • 每日小结   本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。...
  • Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在分布式事务的问题。 业界有很多的解决方案,对此我相信大家都百度一下子就有很多,但是我...
  • 牛逼!Java 从入门到精通,超全汇总版

    万次阅读 多人点赞 2021-05-06 19:40:33
    文章目录Java 基础Head First JavaJava 核心技术卷一Java 编程思想设计模式Head First 设计模式图解设计模式设计模式重学 Java 设计模式Java 进阶Java 并发编程实战Java 并发编程艺术Java 并发编程之美图解Java多...
  • 作者:小宾 ...channel=-1 ...涉及Java、mybatis、redis、zk 上来问了我学校做的外包项目,没问实习项目(实习项目主流语言是golang) 1. 自我介绍 2. 在校做的外包项目深挖(我是项目负责人角色) 3..
  • 温馨提示 本栏目会不定期的更新一些优质的学习...一、Java基础学习资源Java基础:链接: https://pan.baidu.com/s/1c3l8N08 密码: u8d7Html5: 链接: https://pan.baidu.com/s/1c3vcoso 密码: j676Css:链接: https...
  • 数十年从事java工作的经验分享

    千次阅读 2018-11-13 19:19:28
    今天有幸看到一篇好的文章,很有学习的价值,我来分享一下 一位10年的Java工作经验的架构师聊的Java和工作经验 从事近十年的JavaEE应用开发工作,现任阿里巴巴公司系统架构师。...热爱技术交流,乐于分享自己...
  • 将于每日不定时推送一批 GitHub 上优秀的开源项目给开发者, 帮助开发者们发现当下最火的开源项目, 令开发者们得以掌控技术脉搏, 扩大自己的技术视野, 并从开源项目的学习中获得技术能力的提升。 公众号: 微博: 知乎...
  • 自学java一路以来,心血心得整理分享
  • 欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术! 标题:有理数类 有理数就是可以...
  • 每日小结   本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,925
精华内容 4,770
关键字:

java技术每日分享

java 订阅