java基础&设计模式&JVM
文章平均质量分 65
设计模式光看实例是没有用的,反而会出现滥用的情况。学习设计模式是要真正理解里面的抽象思维。
c&0xff00
纸上学来终觉浅
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM进程CPU飙升的问题排查步骤
JVM进程中CPU飙升的问题排查步骤排查步骤定位进程定位线程计算获得线程号的16进制表示分析线程栈排查步骤定位进程通过top命令找出cpu占用高的进程。找到第一个进程,cpu占用达到99.7%,找出pid为8418.定位线程找到问题进程之后,通过top -Hp 8418,查看该进程中的线程。如下:我们看到线程号8509的线程占用cpu很多。计算获得线程号的16进制表示在shell命令行中通过:printf %x 8509,获得线程号的16进制表示为213d:分析线程栈通过jsta原创 2020-12-23 11:03:44 · 1288 阅读 · 0 评论 -
Java8 Stream流操作
java8中的流式操作是一个很重要的内容上图列出了stream主要流操作,我们可以看到,其实流操作可以类比我们的sql语句,如filter就类似于sql的where语句,我们就知道filter是对流进行过滤的,传入了一个Predicate断言接口,过滤掉断言为false的数据。相比一起的循环迭代,移除不符合的数据,是不是更加方便。下面我们来详细说说。1、filter过滤,传入一个Predicate @Test public void testFilter() { Stream<Inte原创 2020-08-26 16:43:14 · 2949 阅读 · 0 评论 -
Lamda表达式 forEach中的return的意义
1原创 2021-04-20 16:12:43 · 668 阅读 · 0 评论 -
单核CPU仍然存在线程安全问题
Java内存模型是什么? 引用大师的一句话:“The Java Memory Model describes what behaviors are legal in multithreaded code, and how threads may interact through memory.” 翻译过来就是:Java内存模型描述了在多线程代码中哪些行为...原创 2020-04-14 16:23:24 · 5870 阅读 · 4 评论 -
JVM调优之---一次GC调优实战
某系统反馈『性能抖动,响应时间会突然飙高,TP999 MAX会到3000+』,初步怀疑是JVM FULL GC导致的 STW,观察FULL GC日志默认的JVM参数: -Xms4096m -Xmx4096m -XX:PermSize=512M -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=1024M -XX:+UseCodeCach...转载 2020-01-05 16:28:31 · 855 阅读 · 2 评论 -
内存分析工具MAT分析内存溢出问题
MAT下载安装:1.在eclipse中安装插件 2.下载独立MAT:下载地址:http://www.eclipse.org/mat/downloads.phpMAT分析的是hprof文件,hprof文件记录了JVM内存溢出时的堆信息,通过分析该文件我们可以分析溢出原因。JVM参数配置:-Xms10M -Xmx10M -XX:+HeapDumpOnOutOfMemoryEr...原创 2019-07-30 17:22:32 · 3029 阅读 · 0 评论 -
翻译-JVM Run-Time Data Areas
原文:https://docs.oracle.com/javase/specs/jvms/se14/html/jvms-2.html#jvms-2.5.3JVM 运行时数据区在程序的运行过程中,JVM定义了多种运行时数据区。其中一些数据区随着JVM启动而创建,同时也随着JVM的退出而销毁(这部分就是线程共享的区域)。另外一区数据区是线程私有的,它随着线程的创建而创建,并当线程退出的时候而销毁。程序计数器(The pc Register)JVM能支持许多线程同时执行。每个虚拟机线程都有它自己的程序计数原创 2020-06-17 17:16:18 · 387 阅读 · 0 评论 -
小白都能看得懂的java虚拟机内存模型
目录一、虚拟机二、虚拟机组成1.栈栈帧2.程序计数器3.方法区对象组成4.本地方法栈5.堆GCGC案例一、虚拟机同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的。同一个java代码在windows上生成的机器码可能是0101.......,在linux上生成的可能是1100.......转载 2019-12-19 14:28:25 · 308 阅读 · 0 评论 -
(一)JVM运行时数据区总结
引言我们知道,JAVA的平台无关性离不开JVM,使得JAVA代码与计算机硬件和 操作系统解耦。关于JVM,贯穿了JAVA编译、执行、优化等方方面面,今天,我们先来看看JVM有哪些区域组成。运行时数据区背一下:堆、栈(虚拟机栈、本地方法栈)、程序计数器、方法区(包含常量池)。除此之外还有本地方法接口和方法库,让方法跑起来的执行引擎。这些都是干嘛的,怎么运作的?堆:存对象用的,我们new出来的对象存在这里,占据虚拟机内存的半壁江山。在jdk7之后,字符串的常量池也被移到堆中(其他常量池还在方法区)。原创 2020-06-15 21:33:16 · 387 阅读 · 0 评论 -
JAVA8 创建流的5种方式
java8中的流式操作是一个很重要的内容1、通过 stream 方法把 List 或数组转换为流,如Arr.stream(); //通过stream方法把List或数组转换为流 Arrays.asList("a1", "a2", "a3").stream().forEach(System.out::println); Arrays.stream(new int[]{1, 2, 3}).forEach(System.out::println);2、通过 Stream.of 方法直接传入多个原创 2020-08-25 20:16:28 · 1163 阅读 · 0 评论 -
java多线程总结 - 原理篇
synchronized关键字java关键字,用于并发线程的同步执行。主要用在:修饰对象:当线程进入该代码块,该线程就会持有对象的锁。当其他线程准备进入该代码块时,就会被阻塞。线程会进入对象的等待队列,知道上一个线程执行结束,释放锁。修饰类静态方法:进入被synchronized修饰的静态方法的线程会持有当前类锁,其他线程无法进入当前类的其他方法。直到上个线程释放类锁。修饰synchronized实现原理(熟悉程度60%)1、如果持有对象的锁:在JVM中,每个对象的头部会有一块记录锁状态的区域,原创 2020-09-23 10:11:21 · 404 阅读 · 0 评论 -
JAVA内存模型(Happens-Before 规则)
JAVA内存模型由来1、cpu多核缓存会带来数据的可见性问题2、编译优化会带来机器指令的有序性问题前面这两个问题是计算机科学,硬件发展衍生出来的。在提高性能的同时,也引发出对并发编程(共享变量)的一些问题。解决可见性问题最简单的思路是禁用cpu缓存,每次读数据从内存中读取,写数据后就及时刷新到内存中。解决有序性问题最简单的思路是禁用指令重排序。说白了就是放弃了计算机发展带来的便利,势必会造成性能的大幅下降。可是我们又要保证程序正确,没有并发问题,那我们可以按需禁用,只在存在并发问题的数据上禁原创 2020-11-04 09:01:46 · 572 阅读 · 1 评论 -
JVM垃圾回收算法总结
什么样的对象是垃圾没有被对象引用的对象,如:方法执行完之后的方法局部变量,随着方法栈回收,局部变量也就成为了垃圾垃圾判断方法引用计数(有缺陷):两个垃圾对象如果存在循环相互引用,则会造成两个垃圾对象都无法回收可达性分析(主流方式):通过一些root节点,如果该对象无法从root节点通过引用关系到达,则判定该对象为垃圾对象。通常root为类静态常量等标记算法回收算法新生代垃圾收集器单线程收集器多线程收集器老年代垃圾收集器多线程标记整理CMSG1...原创 2020-09-19 23:20:09 · 366 阅读 · 0 评论 -
Java8 function包下的函数接口
函数式编程java8引入了函数式编程,被@FunctionalInterface注解标注的接口是函数式接口,顾名思义,函数式接口封装的是函数,相比我们平时写的方法,可以使用lambda表达式进行简化,提高了函数的可复用性。下面我们来看看java.util.function包下几个常见的函数式接口:1、 Predicate封装一个断言,即判断条件,通过lambda表达式重写了接口中的test方法,同时提供了and,or,negate(非)等常用操作 Predicate<Integer>原创 2020-08-26 08:18:41 · 767 阅读 · 0 评论 -
构造器、静态代码块、普通代码块、静态变量初始化顺序 - 总结
问题引入一直对这个问题有了解,也会涉及到类似的问题。刚好有空便测试一把,作为记录。测试代码新建Student与Person类,Student继承Person类。public class Person { private String name; private Integer age; private Boolean sex; private static final String STATIC_FINAL_PARAM = getStaticFinalParam()原创 2021-03-09 19:44:39 · 563 阅读 · 2 评论 -
SimpleDateFormat非线程安全解析
介绍SimpleDateFormat是JDK提供的rt包下的一个时间格式转换的类,它的全类名是:java.text.SimpleDateFormat。从该类的注释中,我们可以了解到:1、可以将date转为text格式2、可以将text转为date格式3、可以针对不同的时区进行转换4、允许你采用自定义的时间patter。(可以使用applyPattern方法来修改转换格式)他自己提供了一部分字母的含义,同时保留了’A’ to 'Z’和 ‘a’ to 'z’所有没有定义的字母,已提供的如下:原创 2021-03-03 12:32:42 · 614 阅读 · 1 评论 -
JDK1.8之前,HashMap#get操作死循环问题剖析
JDK1.8之前,HashMap#get操作死循环问题剖析写在前面问题原因1、头插法:2、在并发环境下使用非线程安全的类具体成环的情况分析问题答疑写在前面1、HashMap本身是线程不安全的(不管哪个jdk版本),所以请不要在并发访问的场景下直接使用HashMap。2、如果在并发访问的场景下,建议采用concurrentHashMap。问题原因1、头插法:我们知道,在jdk1.8之前,hashMap的put操作,或扩容操作,针对hash冲突时采用的是拉链法(将冲突的对象以链表的形式串联起来),新原创 2020-12-23 15:15:43 · 3648 阅读 · 6 评论 -
@Value注解注入List、Set、Map数据结构
百因必有果我今天要讲的配置注入时基于*.properties文件的,yaml格式可能有点区别。借助@Value注解、SPEL表达式实现,请看一下示例:List @Value("#{'${list.type}'.split(',')}") private List<String> listType; list.type=1,2,3,4Set @Value("#{'${spring.redis.cluster.nodes}'.split(',')}") p原创 2020-12-17 16:20:44 · 6883 阅读 · 0 评论 -
Java自定义注解实现接口报文模拟
实现报文模拟1、报文模拟可以采用调用第三方模拟平台实现,整一个模拟集成平台。2、本地创建一个代理,如fiddler等3、本地采用自定义注解开发一个报文模拟代码定义Mock注解:import java.lang.annotation.*;@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Mock { /** * @Descr原创 2020-11-12 16:32:30 · 1114 阅读 · 0 评论 -
JAVA异常体系
JAVA异常体系Error和Exception的区别:Error:程序无法处理的系统错误Exception:程序可以处理的异常,捕获后可能恢复我们主要讲Exception:Exception分类:RuntimeException:运行时异常,编译时是不可预知的。如NullPointerException、ClassCastException、IllegalArgumentException、IndexOutOfBoundsException、NumberFormatException非Runt原创 2020-09-25 13:36:15 · 356 阅读 · 0 评论 -
取模和取余详解
前言关于取模和取余的讲解,网上有很多误人的帖子,我也看了很多,感觉越看越懵,说什么的都有,最终还是得靠自己来证实!取模和取余的步骤:对A和B取模取余操作:A % BC = A / BR = A - C * B取模和取余的区别仅仅是在计算C的时候不同: 取余时:C 值向0靠近取整,比如:C = A / B = 5 / 3 = 1.666666 靠近0取整,则C取 1 ,则R = A - C * B = 2C = A / B = -7 / 2 = -3.5 ,靠近0取整,则C取-3,转载 2020-09-24 09:09:25 · 7869 阅读 · 3 评论 -
JAVA常见问题总结
JVM如何加载class文件jvm读取class文件到方法区,class文件包含常量,类定义等。JVM通过classLoader加载符合class格式的class文件到方法区,再通过执行引擎进行操作。什么是反射反射是jvm可以动态获取虚拟机类和对象,可以知道类中的成员和方法,可以调用对象的方法的技术。写一个反射的示例:public class ReflectionApplication { private static final Logger LOGGER = LoggerFactory.g原创 2020-09-17 22:29:08 · 439 阅读 · 0 评论 -
java 桥接方法
java泛型泛型是在jdk1.5时引入的,java泛型其实不能说是真正的泛型,因为它在JVM运行期是不存在泛型的。java泛型是在编译期做的,将泛型类型擦除,用到的时候又强制转换为需要的类型。看个例子,打印日志,日志内容是泛型:public class PrintLog<T> { public static final Logger log = LoggerFactory.getLogger(PrintLog.class); protected T logContent; pu原创 2020-09-10 09:41:05 · 593 阅读 · 0 评论 -
Java反射中getMethods()与getDeclaredMethod()区别
getMethods获取当前类和父类的所有公有方法(私有的不返回),数组形式返回 @CallerSensitive public Method[] getMethods() throws SecurityException { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); return copyMethods(privateGetPublicMethods());原创 2020-09-10 08:46:42 · 1485 阅读 · 0 评论 -
反射调用重载方法(由入参决定还是获取方法时决定)
反射反射可以在运行时动态获取类与类成员的定义,以及读取方法。不管类中字段方法如何变动,我们都可以以相同的规则来读取。因此,几乎所有的ORM(对象关系映射)、对象映射、MVC 框架都使用了反射。也是事件委托模式中实现的基础。当反射遇上重载定义重载方法,名字都为age,参数一个为Integer,一个为intpublic class ReflectionApplication { private static final Logger LOGGER = LoggerFactory.getLogger(R原创 2020-09-09 10:14:53 · 2847 阅读 · 0 评论 -
Logback.xml配置文件(过滤器、重复记录日志问题)
日志重复打印问题logback.xml<?xml version="1.0" encoding="UTF-8" ?><configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%-5p][%d{yyyy/MM/dd HH:mm:ss}][%t] %logger - %m%n<原创 2020-09-06 20:54:54 · 3289 阅读 · 1 评论 -
当线程池中线程出现异常会发生什么
线程遇到未处理的异常就结束了这个好理解,当线程出现未捕获异常的时候就执行不下去了,留给它的就是垃圾回收了。当线程池中线程频繁出现未捕获异常当线程池中线程频繁出现未捕获的异常,那线程的复用率就大大降低了,需要不断地创建新线程。做个实验:public class ThreadExecutor { private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,原创 2020-09-06 15:51:41 · 3294 阅读 · 0 评论 -
try-with-resources前世今生
try-with-resourcestry-with-resources是1.7新加入的语法糖。针对一些流资源的关闭。只要流资源实现了AutoCloseable接口,就可以通过try-with-resources模式进行自动关闭。异常屏蔽现象一个方法只能抛出一个异常,但finally语句块即使在try块出现异常时也会执行,导致finally块中异常将try块中异常覆盖。如: @Test public void test() throws Exception { Connection conn原创 2020-09-04 16:07:30 · 357 阅读 · 0 评论 -
HashSet与TreeSet的contains方法解读
Set与Map的关系1、看下HashSet的add方法: // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null; }它的put调用了map的put方法,其实Set和原创 2020-09-04 08:35:23 · 1381 阅读 · 0 评论 -
mkdir与mkdirs的区别
项目中需要在代码中读取或创建文件保存路径,用到了mkdir,查看还有个mkdirs方法,这里记录一下两者的区别。1、关于两者的说明如下:boolean mkdir() : 创建此抽象路径名指定的目录。boolean mkdirs() : 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。2、结合自己的理解及具体实践如下: mkdir():只能创建一层目录,如: 1 2 File file =newFile("e:/test"...转载 2020-08-14 17:03:15 · 1038 阅读 · 0 评论 -
Java 字符串常量存放在堆内存还是JAVA方法区?
JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。JDK1.8开始,取消了Java方法区,取而代之的是位于直接内存的元空间(metaSpace)。已知:String A="abc";String B="abc";String C=new String("abc");String D=new String("abc"); 比较A==B是否相等? 比较C==D是否相等? 分析:我们知道基本数转载 2020-07-20 19:25:24 · 1917 阅读 · 2 评论 -
深入剖析Java中的装箱和拆箱
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 若有不正之处,请谅解和批评指正,不胜感激。 请尊重作者劳动成果,转载请标明原文链接:一.什么是装箱?什么是拆箱? 在前面的文章中提到,J转载 2020-07-20 17:09:30 · 315 阅读 · 0 评论 -
集约型编程——你知道HashMap初始化大小应该怎么设置吗
集约型编程就是在考虑代码正确、保证效率的前提下,使用更少的内存,更少的cpu等资源。问题引入:我们来看下面一段代码,引入我们今天的话题: @Test public void generateParam() { HashMap<String, String> paramMap = new HashMap<>(3); paramMap.put("name...原创 2020-05-07 19:23:41 · 740 阅读 · 0 评论 -
RandomAccess接口有什么用?
RandomAccess用来当标记,是一种标记接口。用处是当要实现某些算法时,会判断当前类是否实现了RandomAccess接口,会选择不同的算法。接口RandomAccess中内容是空的,只是作为标记用。比如List下的ArrayList和LinkedList。其中ArrayList实现了RandomAccess。而LinkedList没有。我们可以利用instanceof来判断哪一个是...转载 2020-03-13 13:46:42 · 433 阅读 · 0 评论 -
java7特性 try后面括号的作用(能够自动关闭资源)
Java7新特性,支持使用try后面跟随()括号管理释放资源例如通常使用try代码块 1 try { 2 fis = new FileInputStream(source); 3 fos = new FileOutputStream(target); 4 5 byte[] buf = new byte[1024]; ...原创 2020-02-17 09:58:45 · 1104 阅读 · 0 评论 -
ThreadLocal原理分析与使用场景
什么是ThreadLocal变量ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意:因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。 既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就...转载 2020-01-14 12:22:51 · 426 阅读 · 0 评论 -
关于getClass(),Object.class,getClassLoader的理解
1、对Class类的理解:Class类包含了类的信息,如构造方法、方法、属性,可用于反射。以下是所有方法2、获取Class类对象的几种方法:Test test = new Test();(1).test.getClass(); 在运行时确定,所以运行实例才是该类对象。super.getClass()不能获得父类的类对象,仍然是当前类对象。 获得父类类对象:te...转载 2019-12-12 16:00:47 · 513 阅读 · 0 评论 -
web.xml中的filter配置+spring filter配置中targetFilterLifecycle属性作用
我们平时写过滤器一般有一下两种,以日志过滤器为例: <!--第一种日志过滤器--> <filter> <filter-name>logFilter</filter-name> <filter-class>cn.com.common.filter.LogFilter</filter-...原创 2019-12-04 17:16:23 · 1462 阅读 · 0 评论 -
在元素的装载数量明确的时候HashMap的大小应该如何选择。
今天看到美团招聘给出了一道小题目,关于HashMap的性能问题。问题如下:java hashmap,如果确定只装载100个元素,new HashMap(?)多少是最佳的,why?要回答这个问题,首先得知道影响HashMap性能的参数有哪些。咱们翻翻JDK。在JDK6中是这么描述的:HashMap的实例有两个参数影响其性能:初始容量和加载因子。首先我们来看初始容量和加载因子的定义...转载 2019-12-03 13:33:22 · 419 阅读 · 0 评论 -
java中import作用
import与package机制相关,这里先从package入手,再讲述import以及static import的作用。packageC/C++ 的 #include会把所包含的内容在编译时添加到程序文件中,而java的import则不同。这里我们先了解一下Java 的 package 到底有何用处。package名称就像是我们的姓,而class名称就像是我们的名字 。packag...转载 2019-11-29 10:59:51 · 544 阅读 · 0 评论
分享