Java
文章平均质量分 75
zhifeng687
这个作者很懒,什么都没留下…
展开
-
JVM知识思维导图
参考:Full GC触发条件总结从实际案例聊聊Java应用的GC优化 - 美团技术团队JVM系列之STW、并行与并发、安全点与安全区域G1总结G1垃圾收集器介绍原创 2022-03-31 00:45:19 · 413 阅读 · 0 评论 -
G1和CMS处理器如何选择和各自的适用场景
G1和CMS如何选择G1最小堆内存 6个G能稳定运行,因此对cpu的要求最少是4核8GJDK8及更高版本同等环境下只要内存够大(最少8G)优先使用G1CMSCMS追求停顿时间越短越好对cpu性能要求比较高同时对内存要求不算高(最少4G)JDK8及更高版本同等环境下只要cpu性能比较好并且内存不算大 (最少4G)可以使用CMSJDK7及更低版本同等环境下 可选择CMS (G1不完善)注意:单核、双核cpu不适合并发类垃圾收集器,线程频繁来回切换也会比较耗时间,还不如串行垃圾收集器效率高...转载 2016-02-27 18:48:40 · 4029 阅读 · 0 评论 -
Thread.join的作用和原理
Java中如何让多线程按照自己指定的顺序执行?这个问题最简单的回答是通过Thread.join来实现,久而久之就让很多人误以为Thread.join是用来保证线程的顺序性的。下面这段代码演示了Thread.join的作用public class JoinDemo extends Thread{ int i; Thread previousThread; //上一个线程 public JoinDemo(Thread previousThread,int i){转载 2016-05-25 20:21:28 · 17812 阅读 · 0 评论 -
502 bad gateway问题排查
出现502 bad gateway的原因nginx没有收到服务器的响应直到超时,返回502 bad gateway.具体原因情形一、服务器使用servlet处理请求收到请求后,没有将响应写入SocketOutputStream。情形二、服务器使用netty处理请求收到请求后,没有将响应写入Channel。例如直接return,没有调用ChannelHandlerContext#writeAndFlush()方法。...原创 2017-02-16 11:28:29 · 2857 阅读 · 0 评论 -
NoClassDefFoundError问题排查
常见原因1、缺少依赖的jar包可以通过System.getProperty("java.class.path"),查看jar包是否加载到classpath中。jar包不存在也能编译通过的例子:maven中jar包的scope为<scope>provided</scope>,则编译通过,但运行时发现其他地方没有引入这个依赖会报NoClassDefFoundError错误。2、jar包冲突可以通过maven helper查看jar包冲突问题。也可以根据mavan传递依原创 2016-09-01 11:21:29 · 34028 阅读 · 0 评论 -
LinkedHashMap工作原理
在这篇文章中,我们将会一探LinkedHashMap的内部工作原理。LinkedHashMap VS HashMapLinkedHashMap 也是一个HashMap,但它使用额外的数据结构——双向链表,定义了遍历顺序。默认情况下,遍历顺序等同于插入顺序。它也可以是entries最近被访问的顺序,所以它也能很容易被用来当做LRU Cache。数据结构LinkedHashMap的数据结构拓展自Has...原创 2018-06-11 11:54:29 · 1766 阅读 · 0 评论 -
WeakHashMap工作原理
基本原理WeakHashMap特点是,当除了自身有对key的引用外,此key没有其他引用,那么WeakHashMap会在下次对WeakHashMap进行增删改查操作时及时丢弃该键值对,节约内存使用,此特性使得WeakHashMap非常适合构建缓存系统。 WeakHashMap是主要通过expungeStaleEntries函数的来实现移除其内部不用的entry从而达到的自动释放内存的目的。基本上只...转载 2018-06-11 18:00:21 · 2794 阅读 · 0 评论 -
TreeMap工作原理
一、红黑树简介TreeMap是通过红黑树实现的,增删改查的操作底层都是对红黑树的相关操作,因此先介绍红黑树的相关性质。红黑树顾名思义就是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树二叉树而言我们必须增加如下规则:1、每个节点都只能是红色或者黑色2、根节点是黑色3、每个叶节点(null节点,空节点)是黑色的。4、如果一个结点是红的,则它两个子节点都是黑的...转载 2018-06-12 09:43:45 · 1772 阅读 · 0 评论 -
jdk1.8 HashMap工作原理与power of two offset利用
3. put函数的实现put函数大致的思路为:对key的hashCode()做hash,然后再计算index; 如果没碰撞直接放到bucket里; 如果碰撞了,以链表的形式存在buckets后; 如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD),就把链表转换成红黑树; 如果节点已经存在就替换old value(保证key的唯一性) 如果bucket满了(超...转载 2018-06-12 18:27:26 · 599 阅读 · 0 评论 -
jvm源码分析之oop-klass对象模型
概述HotSpot是基于c++实现,而c++是一门面向对象的语言,本身具备面向对象基本特征,所以Java中的对象表示,最简单的做法是为每个Java类生成一个c++类与之对应。但HotSpot JVM并没有这么做,而是设计了一个OOP-Klass Model。这里的 OOP 指的是 Ordinary Object Pointer (普通对象指针),它用来表示对象的实例信息,看起来像个指针实际...转载 2018-08-01 18:51:37 · 1963 阅读 · 0 评论 -
JAVA Socket超时浅析
JAVA Socket超时浅析套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”。JAVA有两个基于数据流的套接字类:ServerSocket,服务器用它“侦听”进入的连接;Socket,客户端用它初始一次连接。侦听套接字只能接收新的连接请求,不能接收实际的数据包...转载 2016-10-07 00:43:04 · 444 阅读 · 0 评论 -
jdk1.7 HashMap的死循环与jdk1.8 HashMap的优化
因为在放入新的位置时,HashMap会将Entry对象不断的插入链表的头部。插入头部也主要是为了防止尾部遍历,否则这对key的HashCode相同的Entry每次添加还要定位到尾节点。如果条件竞争发送了,可能会出现环形链表,之后当我们get(key)操作时,就有可能发生死循环原创 2015-05-28 15:43:54 · 2531 阅读 · 1 评论 -
匿名内部类
译自oracle官网:Anonymous Classes匿名类使您能够使代码更加简洁。 它们使您能够同时声明和实例化一个类。 除了没有名字之外,它们就像local class。 如果您只需要使用一次local class,请使用它们。声明匿名内部类 虽然本地类是类声明,但匿名类是表达式,这意味着您可以在另一个表达式中定义类。 以下示例HelloWorldAnonymousClasses在局部...翻译 2015-08-11 16:38:00 · 472 阅读 · 0 评论 -
ClassLoader源码分析
原文出处: 加多(微信公号:技术原始积累)一、什么是Classloader一个Java程序要想运行起来,首先需要经过编译生成 .class文件,然后创建一个运行环境(jvm)来加载字节码文件到内存运行,而.class 文件是怎样被加载中jvm 中的就是Java Classloader所做的事情。那么.class文件什么时候会被类加载器加载到jvm中运行那?比如执行new操作时候,当我们使用Clas...转载 2018-03-27 17:40:08 · 904 阅读 · 0 评论 -
JNI查找 native 方法的规则(静态、动态注册)
转载自:JNI查找 native 方法的规则通过上一篇文章,大家明白了调用 native 方法之前,首先要调用 System.loadLibrary 接口加载一个实现了native 方法的动态库才能正常访问,否则就会抛出 java.lang.UnsatisfiedLinkError 异常,找不到 XX 方法的提示。现在我们想想,在 Java 中调用某个 native 方法时,JVM 是通过什么方式...转载 2015-07-27 23:58:09 · 4693 阅读 · 1 评论 -
JNI 开发流程
开发流程JNI 全称是 Java Native Interface(Java 本地接口)单词首字母的缩写,本地接口就是指用 C 和 C++ 开发的接口。由于 JNI 是 JVM 规范中的一部份,因此可以将我们写的 JNI 程序在任何实现了 JNI 规范的 Java 虚拟机中运行。同时,这个特性使我们可以复用以前用 C/C++ 写的大量代码。开发 JNI 程序会受到系统环境的限制,因为用 C/C++...转载 2015-07-12 17:44:11 · 1463 阅读 · 0 评论 -
java 内部类和静态内部类的区别
翻译自oracle官网:Nested ClassesJava编程语言允许您在另外一个类中定义一个类。 这个类被称为嵌套类,并在此处进行说明:class OuterClass { ... class NestedClass { ... }}嵌套类分为两类:静态和非静态。 被声明为静态的嵌套类称为静态嵌套类。 非静态嵌套类称为内部类。class OuterClass {...翻译 2015-08-06 10:12:50 · 445 阅读 · 0 评论 -
JVM-类加载机制
类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示: 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑...转载 2016-01-15 10:16:55 · 425 阅读 · 0 评论 -
字符串常量池、class常量池和运行时常量池
原文链接:http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着...转载 2017-06-12 20:09:36 · 40452 阅读 · 24 评论 -
JVM-对象的指针压缩
什么是java对象的指针压缩?1.jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩2.jvm配置参数:UseCompressedOops,compressed--压缩、oop--对象指针3.启用指针压缩:-XX:+UseCompressedOops,禁止指针压缩:-XX:-UseCompressedOops为什么要进行指针压缩?1.在64位平台的HotSp...转载 2017-06-01 11:38:00 · 1187 阅读 · 0 评论 -
从Native层看java IO文件读写流程(以调用window API为例)
RandomAccessFile类最终调用的是Windows的四个API:OpenFile,ReadFile,WriteFile,GetFilePointer转载 2016-03-26 13:52:40 · 2982 阅读 · 0 评论 -
JVM调优之jstack找出最耗cpu的线程并定位代码
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。第一步先找出Java进程ID,服务器上的Java应用名称为mrf-center:root@ubuntu:/# ps -ef | grep mrf-c...转载 2018-06-25 18:13:42 · 2281 阅读 · 0 评论 -
BufferedInputStream源码分析
BufferedInputStream内部维护一个缓冲字节数组,当调用read(byte[] b)方法时,核心原理是将内部缓冲字节数组的内容,浅复制到方法参数的目标字节数组中。原创 2016-03-27 20:55:08 · 374 阅读 · 0 评论 -
一次线程挂掉的排查与GC overhead limit exceeded
在使用多线程分批写入文件时,发生如下异常:java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded at java.util.concurrent.FutureTask.report(FutureTask.java:122) a...原创 2015-07-20 13:42:26 · 838 阅读 · 0 评论 -
jdk1.8 ConcurrentHashMap源码分析
为什么要用ConcurrentHashMapHashMap线程不安全,而Hashtable是线程安全,但是它使用了synchronized进行方法同步,插入、读取数据都使用了synchronized,当插入数据的时候不能进行读取(相当于把整个Hashtable都锁住了,全表锁),当多线程并发的情况下,都要竞争同一把锁,导致效率极其低下。而在JDK1.5后为了改进Hashtable的痛点,Con...转载 2015-05-27 12:55:01 · 701 阅读 · 0 评论 -
byte&0xff实现32位符号扩展
问题引出最近在阅读tomcat9.0解析http/2的帧头的源码时,遇到这样一串代码:static int getThreeBytes(byte[] input, int firstByte) { return ((input[firstByte] & 0xFF) << 16) + ((input[firstByte + 1] & 0xFF) ...原创 2015-07-31 10:41:44 · 2014 阅读 · 0 评论 -
jvm源码分析之FileChannel的read/write()方法
BtyeChannelBtyeChannel接口提供对通道进行字节读、写的抽象方法。实际上什么都不做,只是继承了ReadableBtyeChannel接口和WriteableByteChannel。SeekableByteChannelSeekableByteChannel接口继承了ByteChannel,但它还提供了position()、size()等方法。一个Seekab...原创 2018-07-02 18:10:20 · 5853 阅读 · 0 评论 -
jvm源码分析之FileChannel.map()方法
map()方法/** * Maps a region of this channel's file directly into memory. * * <p> A region of a file may be mapped into memory in one of three modes: * </p> * ...原创 2015-11-23 21:44:00 · 1287 阅读 · 0 评论 -
jvm源码分析之FileChannel.transferTo()方法
FileChannel.transferTo()方法public abstract long transferTo(long position, long count, WritableByteChannel target) throws IOException;FileChannelImpl.tra...原创 2015-11-14 23:14:02 · 1410 阅读 · 0 评论 -
JDK10 新特性
JDK10 新特性想更详细的了解JDK10新特性可以浏览官方介绍JDK10 新特性目录导航:局部变量类型推断 将JDK多存储库合并为单储存库 垃圾回收接口 并行Full GC 的G1 应用数据共享 线程局部管控 移除Native-Header Generation Tool (javah) Unicode 标签扩展 备用内存设备上分配堆内存 基于实验JAVA 的JIT...转载 2015-08-01 12:20:30 · 553 阅读 · 0 评论 -
-XX:CMSInitiatingOccupancyFraction=70 和-XX:+UseCMSInitiatingOccupancyOnly
CMS GC要决定是否在full GC时做压缩,会依赖几个条件。其中,第一种条件,UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 是搭配使用的;前者目前默认就是true了,也就是关键在后者上。第二种条件是用户调用了System.gc(),而且DisableExplicitGC没有开启。第三种条件是young gen报...转载 2015-08-01 13:15:43 · 7002 阅读 · 0 评论 -
查看java进程的线程状态
查看java进程中的线程数量ps -p pid -T |wc -lps -eLf | grep pid |wc -l查看java进程内最消耗cpu的线程top -Hp pid原创 2015-06-06 14:59:46 · 1862 阅读 · 0 评论 -
记一次java进程占用内存高,Netty中的buffer一直没被gc的排查
最近发现一个项目在部署到机器上的时候,机器内存一直占用很高。接着开始排查机器内存高的原因1、查找机器上占用内存高的进程ps aux |sort -k4nr|head -20查找占用内存高的前20个进程发现前20个进程平均每个进程占用内存3g,总共就占用了60g。每个进程占用内存都很高,是造成机器总体内存高的原因。2、查看进程的内存占用情况以进程号13588为例,使...原创 2019-05-16 16:48:14 · 3519 阅读 · 0 评论 -
Java Hotspot G1 GC的一些关键技术
前言G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出,相信熟悉JVM的同学们都不会对它感到陌生。在JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248)。在官网中,是这样描述G1的:The Garbage-First (G1) col...转载 2017-06-01 11:48:50 · 2567 阅读 · 0 评论 -
jvm源码分析之socketWrite
客户端socket使用示例如下:1.创建Socket对象,指定服务端的地址和端口号2.建立连接后,通过输出输入流进行读写操作3.通过输出输入流获取服务器返回信息4.关闭相关资源import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io...原创 2016-10-13 17:17:11 · 929 阅读 · 0 评论 -
BufferedOutputStream源码分析与flush方法
概述该类是缓冲输出流的实现。通过设置这样的一个输出流,可以避免每写入一个字节都产生一次底层系统调用。write(byte b[], int off, int len)方法从目标字节数组b的给定下标位置offset开始,写入len个字节到缓冲输出流中。该方法实现如下:路径一:如果len >= buf.length,则将缓冲区的内容全部写入到底层输出流,清空缓冲区。然后再将目...原创 2016-03-27 21:43:13 · 2368 阅读 · 0 评论 -
jmap和jstat
概述jmap命令有下面几种常用的用法:•jmap [pid]•jmap -histo:live [pid] >a.log•jmap -dump:live,format=b,file=xxx.xxx [pid]用得最多是后面两个。其中,jmap -histo:live [pid] 可以查看当前Java进程创建的活跃对象数目和占用内存大小。jmap -dump:live,...转载 2016-10-24 15:59:30 · 1578 阅读 · 0 评论 -
Java接口中的成员变量为什么必须是public static final?
1.接口必须要具体类实现才有意义,所以必须是public。2. 接口中的属性对所有实现类只有一份,所以是static。3.要使实现类为了向上转型成功,所以必须是final的。所以可以直接省略修饰符:String param="ssm";//变量需要初始化??为什么接口要规定成员变量必须是public static final的呢???答:首先接口是一种高度抽象的"模版",,而接口中的属性也转载 2016-10-07 00:19:54 · 788 阅读 · 0 评论 -
对象深复制之输出流转输入流
利用串行化来做深复制(主要是为了避免重写比较复杂对象的深复制的clone()方法,也可以程序实现断点续传等等功能) 把对象写到流里的过程是串行化(Serilization)过程,但是在Java程序师圈子里又非常形象地称为“冷冻”或者“腌咸菜(picking)”过程;而把对象从流中读出来的并行化(Deserialization)过程则叫做 “解冻”或者“回鲜(depicking)”过程转载 2016-03-26 12:30:33 · 2346 阅读 · 0 评论 -
Java内存模型 (java memory model,JMM)与内存屏障
转载自:浅析Java内存模型概述Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量是线程共享的,存在竞争问题的。Java内存模型规定了所有的变量都存储在主内存,每条线程还有自己的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等),都必须在工作内存中进行,而...转载 2016-02-27 11:21:51 · 394 阅读 · 0 评论