
Java基础
文章平均质量分 56
jeikerxiao
简单,
展开
-
CPU过高Full GC次数过多问题的排查
服务器CPU 占用率过高问题排查查看进程运行情况# top <pid>查看进程对应线程情况# top -Hp <pid>查看占用CPU过高的线程在jsatck命令展示的结果中,线程id都转换成了十六进制形式。可以用如下命令查看转换结果:# printf "%x\n" <pid>jstack定位CPU占用线程60代表查看60行日志# jstack <pid> | grep <tid 16进制> -A60发现CPU过高的线原创 2021-01-05 17:40:16 · 1301 阅读 · 0 评论 -
服务器CPU占用率过高问题分析
在开发过程中,碰到了Java进程占用cpu过高的现象,本篇来介绍一下排查思路。1. 查看占用CPU过高Java进程使用 top -p <pid> 命令(为Java进程的id号)查看Java进程的cpu占用:该Java进程占用cpu达到100%。top -p <pid>2. 查看进程是所有线程的情况使用 top -Hp <pid> 命令(为Java进程的id号)查看该Java进程内所有线程的资源占用情况:按shft+p按照cpu占用进行排序,按shif原创 2020-12-07 13:15:51 · 2674 阅读 · 0 评论 -
inputStream 流的复制
inputStream 流的复制获取到一个 inputStream 后,可能要多次利用它进行 read 的操作。由于流读过一次就不能再读了,而 InputStream 对象本身不能复制,而且它也没有实现Cloneable接口。实现思路:先把 InputStream 转化成 ByteArrayOutputStream后面要使用 InputStream 对象时,再从 ByteArrayOutputStream 转化回来代码实现如下:package com.jeiker; import ja原创 2020-10-15 23:35:55 · 4121 阅读 · 0 评论 -
FTP 的主动模式和被动模式
一、模式说明1. PORT(主动模式)PORT中文称为主动模式,工作的原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,...原创 2020-04-13 19:52:43 · 1162 阅读 · 0 评论 -
类文件结构
类文件结构代码编译的结果从本机机器码转变为字节码,是存储格式发展的一小步,支是编程语言的一大步。1. 概述原来,程序需要编译成二进制本地机器码。类似C语言。之后,大量的语言可以建立在虚拟机上,这样可以将我们的程序编译成与操作系统和机器指令集无关的、平台中立格式作为程序编译后的存储格式。2. 无关性的基石如果计算机的CPU指令集只有x86一种,操作系统也只有Windows一种,那也许Ja...原创 2019-01-30 17:33:16 · 166 阅读 · 0 评论 -
虚拟机性能监控与故障处理工具
1. 概述理论总是作为指导实践的工具,能把这些知识应用到实际工作中才是我们的最终目的。给系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志异常堆栈GC日志线程快照(threaddump/javacore文件)堆转储快照(heapdump/hprof文件)工具永远都是知识技能的一层包装。2. JDK的命令工具...原创 2019-01-29 20:52:17 · 279 阅读 · 0 评论 -
Java 多线程的基本概念及意义
1.线程依赖于进程而存在进程,正在运行的程序。是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。2.多进程的意义单进程的计算机只能做一件事,而现在都可以做多件事情,支持多进程,可以在一个时间段内执行多个任务。 提高CPU的使用率~问题:一边玩游戏,一边听音乐是同时进行吗?不是。因为单CPU在某一个时间点上只能做一件事情。(多核可以实现,但是会有很多进程,...转载 2019-01-09 18:33:25 · 2278 阅读 · 0 评论 -
Java虚拟机中对象
Java虚拟机中对象问题:如何创建对象?如何在内存中存储对象?如何访问对象?1.对象的创建语言层面:创建一个对象,使用new 关键字就可以了。虚拟机层面,对象的创建又是怎样的过程呢?虚拟机遇到一条new指令时:先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载过程。...原创 2019-01-24 20:05:01 · 390 阅读 · 0 评论 -
Java内存区域与内存溢出异常
Java内存区域与内存溢出异常1. 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作当前线程所执行的字节码的行号指示器。在虚拟机的概念模型中(仅是概念模型,实际各种虚拟机可能采用不同的实现方式来实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖...原创 2019-01-23 22:44:33 · 138 阅读 · 0 评论 -
Java中assert(断言)的使用
1.IDEA打开断言1.IDEA中默认assert(断言)是关闭,开启方式如下:简单来说:就是设置一下jvm的参数,参数是-enableassertions或者-ea(推荐)。2.assert格式1.格式1assert [boolean 表达式]如果[boolean表达式]为true,则程序继续执行。如果为false,则程序抛出AssertionError,...原创 2018-08-31 21:51:07 · 53540 阅读 · 3 评论 -
POI Excel列宽中文自适应
POI Excel列宽中文自适应// 自适应宽度(中文支持)private void setSizeColumn(HSSFSheet sheet) { for (int columnNum = 0; columnNum <= 8; columnNum++) { int columnWidth = sheet.getColumnWidth(columnNum) /...原创 2018-06-15 10:57:30 · 14161 阅读 · 0 评论 -
Java CountDownLatch的应用
Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。你可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。CountDownL...原创 2019-06-19 14:47:04 · 297 阅读 · 0 评论 -
Java 并发编程
Java 并发编程前言并发编程可以总结为三个核心问题:分工:高效拆解任务并分配给线程同步:线程之间的合作互斥:同一时刻只允许一个线程访问共享资源。分工、合作、不抢打印机。Java SDK 并发包很大部分内容都是按照这三个维度组织的,如:Fork/Join 框架就是一种分工模式。CountDownLatch 就是一种典型的同步方式。可重入锁 就是一种互斥手段。Java ...原创 2019-06-19 17:02:51 · 149 阅读 · 0 评论 -
Java 内存模型
Java 内存模型看Java 如何解决可见性和有序性问题并发编程bug之源:可见性原子性有序性先看如何解决可见性和有序性问题–Java内存模型什么是Java内存模型?缓存导致可见性编译优化导致有序性那么解决可见性,有序性最直接的办法就是禁用缓存和禁用编译优化,但这样问题虽然解决了,但程序就有性能问题了。合理的方案是按需禁用缓存以及编译优化。那么,怎么做到“按需禁用”...原创 2019-06-20 10:11:23 · 370 阅读 · 0 评论 -
Java 互斥锁:解决原子性问题
Java 互斥锁:解决原子性问题一个或多个操作在CPU执行的过程中不被中断的特性,称为“原子性”。原子性的问题怎么解决?原子性问题的源头就是线程切换。如果能够禁用线程切换那不就能解决这个问题吗?而操作系统做线程切换是依赖CPU中断的,所以禁止CPU发生中断就能够禁止线程切换。单核CPU时代,这个方案是可行的,但是并不适合多核场景。如:32位CPU上执行long型变量的写操作为例,lon...原创 2019-06-20 11:24:34 · 907 阅读 · 0 评论 -
Java 互斥锁:如何用一把锁保护多个资源
Java 互斥锁:如何用一把锁保护多个资源怎么用一把锁保护多个资源?当我们要保护多个资源时,首先要区分这些资源是否存在关联关系。保护没有关联关系的多个资源不同的资源用不同的锁保护,各自管各自的。class Account { // 锁:保护账户余额 private final Object balLock = new Object(); // 账户余额 pr...原创 2019-06-20 14:29:37 · 4397 阅读 · 1 评论 -
Java 死锁
Java 死锁使用细粒度锁可以提高并行度,是性能优化的一个重要手段。的确,使用细粒度锁是有代价的,这个代价就是可能会导致死锁。死锁:一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象。如何预防死锁解决死锁问题最好的办法还是规避死锁。如何避免死锁呢?只有以下4个条件都发生时,才会出现死锁:互斥,共享资源A和B只能被一个线程占用。占有且等待,线程T1 已经取得共享资源A,...原创 2019-06-20 15:11:25 · 183 阅读 · 0 评论 -
Java 用“等待-通知”机制优化循环等待
Java 用“等待-通知”机制优化循环等待在等待不消息CPU的情况下,最好的方案应该是:如果线程要求的条件不满足,则线程阻塞自己,进入等待状态;当线程要求的条件满足后,通知等待的线程重新执行。就医流程基本上是这样:患者先去挂号,然后到就诊门口分诊,等待叫号;当叫到自己的号时,患者就可以找大夫就诊了;就诊过程中,大夫可能会让患者去做检查,同时叫下一位患者;当患者做完检查后,拿...原创 2019-06-20 15:58:45 · 2252 阅读 · 0 评论 -
java 怎么合理的打印日志
1.日志的主要作用1)日志是系统运行的“照妖镜”,通过它能够实时反映系统的运行状态;如上图所示,系统A中producer不断产生数据放入到data queue中,sender不断从data queue中取数据发送给下游系统B的receiver,那么对于系统A来说,data queue中的待发送数据量便是一个非常关键的指标,它能够从侧面真实反应当前系统的运行状况,如果data queue中的el...原创 2019-08-20 15:45:27 · 4083 阅读 · 0 评论 -
java 分布式ID生成器
分布式ID生成器使用UUID:缺点:太长,且没有顺序。使用Redis:缺点:Redis压力大,以及额外网络开销。使用分布式ID生成器:是由程序来生成唯一的主键的值。(本文使用)snowflake(雪花)算法/** * <p>名称:IdWorker.java</p> * <p>描述:分布式自增长ID</p> * <pre>...原创 2019-08-21 20:03:30 · 737 阅读 · 1 评论 -
Java 序列化
前言对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了。停留在了表面,在项目中使用Dubbo时,发现对象需要实现Serializbale,涉及到了序列化问题。就补了一下Java序列化的底层实现。1.WhatJava序列化 是指把Java对象保存为二进制字节码的过程;Java反序列化 是指把二进制字节码重新转换成Java对象的过程。那么为...原创 2018-05-15 11:25:26 · 257 阅读 · 0 评论 -
IntelliJ IDEA 自动生成 serialVersionUID
设置IDEA设置model对象自动提示 serialVersionUID。Setting->Inspections->Serialization issues->Serializable class without ’serialVersionUID’ 。使用选上以后,在你实现了Serializable 接口的class 中:就会提示自动创建serialVer...原创 2018-05-15 09:36:03 · 659 阅读 · 0 评论 -
Java 一切都是对象
Java 一切都是对象尽管Java是基于C++的,但是相比之下,Java是一种更“纯粹”的面向对象程序设计语言。C++和Java都是混合、杂合型语言。C++之所以成为一种杂合型语言主要原因是因为它支持与C语言的向后兼容。因为C++是C的一个超集,所以势必包括许多C语言不具备的特性,这些特性使C++在某些方面显得过于复杂。Java语言假设我们只进行面向对象的程序设计。用引用操作对象每种编程语言都有自己原创 2017-04-13 19:51:50 · 1058 阅读 · 0 评论 -
Java-对象导论
1.Java-对象导论 我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来… …除非赞成这个协定中规定的有关语言信息的组织和分类,否则我们根本无法交谈。—Benjamin Lee Whorf计算机革命起源于机器,因此,编程语言的产生也始于对机器的模仿。计算机是头脑延伸的工具,同时还是一种不同类型的表达媒体原创 2017-04-11 16:01:56 · 671 阅读 · 0 评论 -
Java 继承
1. 类、超类和子类“is-a”关系是继承的一个明显特征。关键字extends表示继承。表明下在构造的新类派生于一个已经存在的类。已经存在的类称为超类(super class)、基类(base class)或父类(parent class).1.1 覆盖方法超类中的有些方法对子类并不一定适用。为此需要提供一个新的方法来覆盖(override)超类中的这个方法。1.2 子类构造器关键字this有两个用原创 2017-04-09 13:17:13 · 589 阅读 · 0 评论 -
Java 对象与类
1. 面向对象程序设计概述面向对象的程序是由对象组成了,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中很多对象来自标准库,还有一些是自定义的。传统的结构化程序设计通过设计一系列的过程(即算法)来求解问题。一旦确定了这些过程,就要开始考虑存储数据的方式。这就是Pascal语言的设计者 Nikaus Wirth将其著作命名为《算法+数据结构=程序》的原因。在这个命名中,算法是第一位,数据结原创 2017-04-08 20:30:32 · 446 阅读 · 0 评论 -
Java 的基本程序设计结构
1.一个Demopublic class FiristDemo { public static void main(String[] args) { System.out.println("this first java demo"); }}java 区分大小写关键字class 后面是类名类名以大写字母开头,每个单词第一个字母大写(驼峰命名法)源代码的文件名原创 2017-04-08 19:22:47 · 742 阅读 · 0 评论 -
正则表达式 - 语法
语法普通字符普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。非打印字符 字符 描述 \cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 \f 匹配一个换页符。等价于 \x0c 和原创 2017-02-23 14:16:41 · 421 阅读 · 0 评论 -
关于model层建VO和PO
一、POpersistant object 持久对象,可以看成是与数据库中的表相映射的java对象。二、VOvalue object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要. 有一种观点就是:PO只能用在数据层,VO用在商业逻辑层和表示层。 各层操作属于该层自己的数据对象,这样就可以降低各层之间的耦合原创 2016-11-23 10:34:43 · 7603 阅读 · 0 评论 -
@JsonView 简单介绍
@JsonView是jackson json中的一个注解,spring webmvc也支持这个注解。这个注解的作用就是控制输入输出后的json.假设我们有一个用户类,其中包含用户名和密码,一般情况下如果我们需要序列化用户类时,密码也会被序列化,在一般情况下我们肯定不想见到这样的情况。但是也有一些情况我们需要把密码序列化,如何解决这两种不同的情况呢?使用@JsonView就可以解决。@JsonView原创 2016-09-26 08:46:08 · 1146 阅读 · 0 评论 -
Java 初始化与清理
初始化和清理(cleanup)正是涉及安全的两个问题。C++引入了构造器(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法。Java中采用了构造器,并额外提供了“垃圾回收器”。对于不再使用的内存资源,垃圾回收器能自动将其释放。1 用构造器确保初始化在Java中,通过提供构造器,类的设计者可能确保每个对象都会得到初始化。创建对象时,如果其类具有构造器,Java就会在用户有能力操原创 2017-04-23 09:48:55 · 544 阅读 · 0 评论 -
Java 访问权限控制
访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关。所有优秀的作者,包括那些编写软件的程序员,都清楚其著作的某些部分直至重新创作的时候才变得完美,有时甚至要反复重写多次。如果你把一个代码段放到了某个位置,等过一会儿回头再看时,有可能发现有更好的方式去实现相同的功能。这正是重构的原动力之一,重构即重写代码,以使得它更可读、更易理解,并因此而更具可维护性。但是,这种修改和完善代码的愿望之下,也存在着原创 2017-04-23 10:30:47 · 707 阅读 · 0 评论 -
Java 复用类
Java中所有问题的解决都是围绕着类的展开的。可以通过创建新类来复用代码,而不必重头开始编写。可以使用别人已开发并调度好的类。此方法的窍门在于使用类而不破坏现有程序代码。有两种方法可以达到这个目的:只需要在新的类中产生现有的对象。(由于新的类是由现有类的对象所组成,故称为组合)按照现有的类的类型来创建新类。(无需改变现有类,并在其中添加新代码。称为继承)1 组合语法只需将对象引用置于新类中即可原创 2017-04-25 09:42:15 · 531 阅读 · 0 评论 -
Java8 lambda表达式
1. 实现Runnable线程案例可以使用下面语法实现Lambda:1. (params) -> expression2. (params) -> statement3. (params) -> { statements }例如:方法接受两个方法参数。(int even, int odd) -> even + odd推荐简写:(int...原创 2018-04-28 17:01:45 · 477 阅读 · 1 评论 -
JVM-java类的加载机制
1.什么是类的加载1.1 类加载定义类的加载指的是:将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是:位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。1.2...原创 2018-04-04 13:38:39 · 220 阅读 · 0 评论 -
Java 实现HTTP协议
实例import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSoc原创 2017-10-23 17:32:14 · 3912 阅读 · 0 评论 -
Java NioSocket 的用法
说明从 JDK1.4 开始, Java增加了新的 io 模式,nio(new IO), nio在底层采用了新的处理方式,极大地提高了IO的效率。nio与原来的io对比: io nio ServerSocket ServerSocketChannel Socket SocketChannel要理解 NioSocket 的使用必须要理解三个概念:BufferChannelS原创 2017-10-23 16:16:54 · 376 阅读 · 0 评论 -
Java Servlet HelloWorld
创建一个基于Maven 的 Servlet HelloWorld程序。程序代码pom.xml<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM原创 2017-10-23 16:55:21 · 393 阅读 · 0 评论 -
Java 中Socket的用法
普通Socket的用法Java中的网络通信是通过Socket实现的Socket分为两类:ServerSocket:用于服务端,可以通过accept方法监听请求,监听到请求后返回Socket。Socket:用于具体完成数据传输,客户端直接使用Socket发起请求并传输数据。ServerSocket(服务端)ServerSocket的使用可分为三步:创建 ServerSocket。 调用创建出原创 2017-10-22 16:29:21 · 2505 阅读 · 0 评论 -
Log4j2 使用 ELK 简单介绍
ELK 介绍ELK 是 Logstash+ElasticSearch+Kibana:Logstash 负责收集日志ElasticSearch 负责存储日志Kibana 提供Web界面查看日志信息Log4j2配置Log4j2为我们提供SocketAppender,使得我们可以通过TCP或UDP发送日志,详见:http://logging.apache.org/log4j/2.x/manual/原创 2017-09-26 10:45:33 · 5183 阅读 · 0 评论