自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

写后端的小学生

永不懈怠

  • 博客(54)
  • 收藏
  • 关注

原创 2.Java堆对象分配,布局和访问的全过程

对象的创建       这里说的对象指的是普通Java对象,不包括数据和Class对象等。       类加载过程:虚拟机遇到new指令,首先去检查new指令的参数是否能在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否已被加载,解析和初始化过。如果没有,那么先执行相应的类加载过程。       堆内存分配:在类加载检查通过后,要创建的对象所需的内存大小已经确定了,虚拟机将一块确定大小...

2018-03-31 14:51:08 1307

原创 1.JVM优化-JVM运行时数据区域

       内存动态分配和垃圾收集技术是JVM的关键技术运行时数据区域       Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。每个区域都有各自的用途,以及各自的创建和销毁时间。有些区域随着虚拟机进程的启动而建立,有些区域则依赖于用户线程的启动和结束而建立和销毁。程序计数器(Program Counter Register)      程序计数器是一块较...

2018-03-27 23:29:58 964 1

原创 1.详解Servlet

前言       Servlet就是Server+Applet的缩写,表示一个服务器应用。Servlet就是一个代码规范,我们按照这个规范写的程序就能在服务器上运行。Servlet接口public interface Servlet { //在容器启动的时候被调用,仅调用一次 //当load-on-startup设置为负数或不设置的时候,会在Servlet第一次调用时才会被调用,仅...

2018-03-13 22:53:54 2177 2

原创 4.回收方法区

      Java虚拟机规范当中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区中进行垃圾收集的“性价比”比较低。在堆中,尤其是在新生代中,常规应用进行一次垃圾收集一般可以回收70%~95%的空间,而永久代的垃圾收集效率远低于此。       永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。回收废弃常量与回收Java堆中的对象非常类似。       以常量池中字面量的回收为例,...

2018-03-31 22:40:54 975

原创 3.检测对象是否可以回收及Java的引用

确定对象是否可以回收了       在堆里面存放了几乎所有的对象实例,垃圾收集器在对堆进行来及回收之前,需要确定哪些对象可以被回收了(即,不可能再被任何途径使用了)。引用计数算法      给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用了。      很多人,是这样解释引用计数算法的。      引用计数...

2018-03-31 22:03:03 1225 1

原创 18.JDK线程池概述

什么是线程池       为了避免系统频繁地创建和销毁线程,可以让创建的线程进行复用。线程池中,有几个活跃的线程,当你需要的线程时候,可以从线程池中哪一个空闲线程。使用完毕后,不关闭这个线程,而是把线程还回线程池。       简单来说,在使用线程池后,创建线程变成了从线程池获得空闲线程,关闭线程变成了向线程池归还线程。JDK对线程池的支持        JDK提供了Executor框架,帮助我们...

2018-03-31 13:35:11 1002

原创 15.循环栅栏:CyclicBarrier

       CyclicBarrier与CountDownLatch功能类似,也可以实现线程间的计数等待,但它的功能比CountDownLatch更加强大。       CyclicBarrier之所以翻译为循环栅栏,栅栏的意思就是,阻止线程继续执行,要求线程在栅栏出等待。循环的意思是指,这个栅栏可以反复使用。       比如,我们设置计数器为10,那么凑齐第一批10个线程之后,计数器就会归零...

2018-03-30 15:51:11 1026

原创 14.倒计时器:CountDownLatch

       CountDownLatch是一个非常实用的多线程控制工具类,它通常用来控制线程等待,可以让某个线程保持等待直到一定数量的线程执行结束,再开始执行。//接收一个整数参数,作为这个倒计时器的计数个数//表示多少个线程执行完毕之后,我才执行public CountDownLatch(int count)public class CountDownLatchDemo implement...

2018-03-30 14:32:49 1006

原创 11.ReadWriteLock读写分离锁

       ReadWriteLock读写分离锁可以有效地减少锁竞争,以提升系统性能。       比如线程A1,A2,A3进行写操作,B1,B2,B3进行读操作。如果使用重入锁(ReenTrantLock)或内部锁(Synchronized),则所有的读之间,读与写之间,写与写之间都是串行的。由于读操作并不对数据的完整性造成破坏,所以这种等待其实是不合理的。因此,就有了读写分离锁。      ...

2018-03-30 10:12:56 1557 1

原创 54.螺旋矩阵(Spiral Matrix)

问题描述给出一个 m x n 的矩阵(m 行, n 列),请按照顺时针螺旋顺序返回元素。例如,给出以下矩阵:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]应该返回 [1,2,3,6,9,8,7,4,5]解题思路和分析方法一:模拟直觉就是按照这个顺时针的顺序将数组中的数字输出。       矩阵有R行,C列,seen[r][c]数组用来标记是否被访问过。我们...

2018-03-27 18:31:13 1987

原创 6.Java程序优化-引用类型

前言      有4个级别的引用:强引用,软引用,弱引用和虚引用。在这4个引用级别中,只有强引用FinalReference类是包内可见的,其他3中引用类型均为public,可以在应用程序中直接使用。强引用      类似于指针,通过引用可以对堆中的对象进行操作。当创建一个对象时,该对象被分配到堆中,通过这个对象的引用才能对这个对象进行操作。StringBuffer str = new Strin...

2018-03-27 15:00:07 874

原创 5.Java程序优化-直接内存访问

       Buffer提供了可以直接访问系统物理内存的类-DirectBuffer。DirectBuffer继承自ByteBuffer,ByteBuffer任然在JVM堆上分配内存,其最大内存,受到最大堆的限制。而DirectBuffer直接分配到物理内存中,并不占用堆空间。       在对ByteBuffer进行访问的时候,系统会使用一个“内核缓冲区”进行间接的操作。而DirectBuff...

2018-03-27 09:05:23 1544

原创 4.Java程序优化-NIO

前言              Java标准I/O中,提供了基于流的I/O实现,即InputStream和OutputStream,以字节为单位处理数据,并且非常容易建立各种过滤器。       NIO是New I/O的简称,具有以下的几个特点:       1.为所有的原始类型提供(Buffer)缓存支持;       2.使用Java.nio.charset.Charset作为字符集编码解码解...

2018-03-26 20:29:17 958

原创 9.回文数(Palindrome Number)

题目描述判断一个整数是否是回文数。不能使用辅助空间(即要求空间复杂度为O(1))。负整数可以是回文数吗?(例如 -1,不可以,所有的负数都不是回文数)如果你打算把整数转为字符串,请注意不允许使用辅助空间的限制。你也可以考虑将数字颠倒。但是如果你已经解决了 “颠倒整数” 问题的话,就会注意到颠倒整数时可能会发生溢出。你怎么来解决这个问题呢?解题思路分析和实现方法方法一:      第一反应就是将整数...

2018-03-26 16:15:55 2561 1

原创 6.Z字形转换(ZigZag Conversion)

题目描述将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:(下面这样的形状)P A H NA P L S I I GY I R之后按逐行顺序依次排列:"PAHNAPLSIIGYIR"实现一个将字符串进行指定行数的转换的函数:string convert(string text, int nRows);convert("PAYPALISHIRING", 3...

2018-03-26 14:43:02 3961

原创 5. 最长回文子串(Longest Palindromic Substring)

题目描述       给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 长度最长为1000。       回文串是指正读和反读都一样的字符串。解题思路及实现方法一:最长公共子串       反转S,变成T,S与T的最长公共子串Y就是最长回文子串。       当S="abacdfgdcaba"时,T="abacdgfdcaba",Y="abacd",很明显Y不是回文串。       ...

2018-03-26 09:51:29 5600

原创 4.两个排序数组的中位数(Median of Two Sorted Arrays)-Tag

题目描述有两个大小为 m 和 n 的排序数组 nums1 和 nums2 。请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) 。示例 1:nums1 = [1, 3]nums2 = [2]中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]中位数是 (2 + 3)/2 = 2.5解题思路和实现...

2018-03-25 20:35:20 823

原创 3.无重复字符的最长子串(Longest Substring Without Repeating Characters)

题目描述给定一个字符串,找出不含有重复字符的 最长子串 的长度。示例:给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。解题思路和方法

2018-03-25 19:57:12 882

原创 2.两数相加(Add Two Numbers)

题目描述       给定两个非空链表来代表两个非负整数,位数按照从低位到高位方式存储,它们的每个节点只存储一个数字。将这两数相加,返回一个新的链表。       假设除了数字 0 之外,这两个整数都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807    ...

2018-03-24 21:13:52 906

原创 1.两数之和(Two Sum)

题目描述给定一个整数数列,找出其中和为特定值的那两个数。你可以假设每个输入都只会有一种答案,同样的元素不能被重用。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解题思路和方法方法一:蛮力解决       遍历每个元素x,并确定是否有另外一个元素y=target-x。时间复...

2018-03-24 19:35:51 949

原创 2.Java程序优化-字符串优化处理之StringBuffer和StringBuilder

为什么需要使用StringBuffer或StringBuilder类           由于String对象是不可变的,所以在需要对字符串进行修改时,如果使用String,String对象总是会生成新的对象,所以,其性能比较差。       在这个时候,推荐使用StringBuffer和StringBuilder类。StringBuilder result = new StringBuilder...

2018-03-22 20:48:32 1096

原创 1.Java程序优化-字符串优化处理

String对象及其特点       String并不是Java的基本数据类型,从String的代码实现来说,它主要包括三个部分:char数组,偏移量和String的长度。char数组表示String的内容,它是String对象所表示的字符串的超集。String的真实内容还需要由偏移量和长度在这个char数组中进行定位和截取。       String对象具有三个基本特点:       不变性:S...

2018-03-22 10:06:56 601

原创 13.JDK并发包-同步控制之信号量(Semaphore)

      信号量是对锁的扩展。无论是内部锁synchronized还是重入锁ReentrantLock,一次都只允许一个线程访问某个临界资源。但信号量可以指定多个线程,同时访问某个临界资源。//信号量的构造函数public Semaphore(int permits) //指定信号量的准入数,即同时能申请多少个许可//当一个线程每次只申请一个许可时,这就相当于指定了同时最多有多少个线程可...

2018-03-21 16:20:30 638 1

原创 12.JDK并发包-同步控制之Condition条件

       Condition的作用和wait(),notify()方法的作用是大致相同的。但是wait()和notify()方法是个synchronized关键字结合使用的,而Condition是和重入锁结合使用的。重入锁实现了Lock接口。      通过Lock接口的Condition newCondition()方法就可以生成一个与当前重入锁绑定的Condition实例。利用Condit...

2018-03-21 15:25:58 613

原创 10.J.U.C-同步控制之重入锁(ReentrantLock)

前言       ReeterLock和synchronized具有相同的内存语义;      0.与sysnchronized相比,重入锁具有显示的操作过程,开发人员必须指定何时加锁,何时释放锁。因此,重入锁更加灵活;          1.与synchronized相比,ReentrantLock功能更加强大;       2.ReentrantLock还提供了条件Condition,对线程的...

2018-03-21 10:30:25 684

原创 5.Tomcat其他组件概述

划分

2018-03-19 21:24:53 531

原创 4.Tomcat生命周期管理

Tomcat

2018-03-19 21:23:42 585

原创 3.Tomcat分析-顶层结构及启动过程(二)

Catalina的启动过程

2018-03-19 21:22:51 537

原创 4.IP(Internet Protocol):网际协议

前言       IP是TCP/IP协议族中最核心的协议,所有的TCP,UDP,ICMP和IGMP数据都以IP数据报的格式传输。负责将数据包发送给最终的目标计算机。IP协议能够让两台计算机之间进行通信。      IP提供了不可靠无连接的数据报传送服务。      不可靠(unreliable)是指它不能保证IP数据报能成功地到达目的地。IP仅提供传输服务,如果发生某种错误,如某个路由器暂时用完了...

2018-03-19 14:38:31 938

原创 3.链路层

前言      从上图中可以看出,链路层主要有两个作用:            1.为IP模块发送和接收IP数据报;            2.为ARP和RARP发送和接收ARP和RARP应答;      当然,TCP/IP支持多种不同的链路层协议,具体取决于网络所使用的硬件,如以太网,令牌环网等。最大传输单元(MTU)       链路层的数据帧的长度是有限制的,这个最大的长度叫MTU,最大传输...

2018-03-19 10:22:49 538

原创 2.TCP/IP协议族概述(二)

网络地址           互联网上的每个接口都有唯一的IP地址,IP地址长32bit,具有一定的结构,有5类IP地址。这个32位的地址通常用4个十进制整数来表示,每个整数对应一个字节,这种表示方法叫“点分十进制表示法”,如140.252.13.33。       区分各类地址的最简单的方法是看它的第一个十进制整数。网络号的分配由某个机构负责分配,主机号由系统管理员负责分配。      有三类I...

2018-03-18 23:18:22 616

原创 1.TCP/IP协议族概述(一)

TCP/IP协议族的分层      网络协议分不同层次进行开发,每一层分别负责不同的通信功能。TCP/IP协议族是一个四层的协议系统。      链路层:通常包括操作系统中的设备驱动程序和计算机中的网卡,它们一起处理与电缆(或其他的传输媒介)的物理接口细节。涉及到了以太网协议,如ARP(地址解析协议,转换IP层和链路层使用的地址)和RARP(逆地址解析协议)协议。      网络层:处理分组在网络...

2018-03-18 17:14:15 633

原创 9.J.U.C:AQS(队列同步器)

      AQS,AbstractQueuedSynchronizer,即队列同步器;      它是构建锁或者其他同步组件的基础(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),是JUC并发包中的核心基础组件;      AQS实现了同步器涉及的大量细节问题,例如获取同步状态、FIFO同步队列等等;所以,基于AQS构建同步器可以极大地减少工作...

2018-03-17 15:54:10 674

原创 7.Java内存模型-volatile的使用方法和实现原理

使用方法       为了在适当的场合,确保线程间的有序性,可见性和原子性,Java使用了一些特殊的操作或者关键字来申明,告诉虚拟机,在这个地方,需要注意不能随意变动或优化目标指令。       关键字volatile就是其中之一。       当你用volatile去申明一个变量时,就等于告诉虚拟机,这个变量极有可能会被某个程序或线程修改。为了确保这个变量被修改后,应用程序范围内的所有线程都能看...

2018-03-16 23:00:01 437

原创 3.线程的基础知识

       进程是程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体,在当代面向线程设计的计算机结构中,进程是线程的容器。程序是数据及其组织形式的描述,进程是程序的实体。       简单地说就是,在windows中,看到后缀为.exe的文件,都是一个程序。当你双击这个.exe运行的时候,这个.exe文件中的指令就会...

2018-03-16 22:54:14 367

原创 4.Java内存模型(JMM)-概述

缓存一致性问题       计算机在运行程序时,每条指令都是在CPU中执行的,在执行过程中势必会涉及到数据的读写。但数据是存储在主存中,读写主存中的数据没有CPU中执行指令的速度快;       所以,如果任何的交互都需要与主存打交道则会大大影响效率,那就有了CPU高速缓存。每个CPU都有高速缓存,它只与在该CPU上运行的线程有关;       在程序运行中,会将运行所需要的数据复制一份到CPU高...

2018-03-16 15:39:33 431

原创 2.Java高并发必须要知道的几个概念(二)

并发级别       由于临界区的存在,多个线程之间的并发必须受到控制。我们把并发的级别分为:阻塞,无饥饿,无障碍,无锁和无等待。阻塞(Blocking)       阻塞的线程在其他线程释放资源之前,无法继续执行。我们使用的synchronized和重入锁,都会在继续执行后续代码之前,尝试获得临界区的锁,如果得不到,该线程就会被挂起(阻塞),直到得到想要的资源。无饥饿(Starvation-Fr...

2018-03-16 14:34:27 468

原创 1.Java高并发必须要知道的几个概念(一)

同步(Synchronous)和异步(Asynchronous)       同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。并发(Concurrency)和并行(Parallelism)       并发...

2018-03-15 22:55:10 511

原创 5.Java 8避免Null值检查

前言        NullPointerException异常在Java中非常常见。所以,我们必须做一些事情来防止NullPointerException异常。做法当然添加null检查。本文将介绍,如何利用像 Lambda 表达式这样的 Java 8 新特性来编写null 检查的几个技巧。技巧一:Optional类型class Outer { Nested nested; Nes...

2018-03-15 19:40:37 1047

原创 2.Tomcat分析-顶层结构及启动过程(一)

顶层结构      Tomcat中最顶层的容器叫Server,代表整个服务器。Server中包含至少一个Service,每个Service用于提供具体的服务。Service主要包含两个部分:Connector和Container。Connector用于处理与连接相关的事情,并提供Socket与request,response的转换。Container用于封装和管理Servlet,并具体处理requ...

2018-03-15 11:01:15 383

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除