Java
文章平均质量分 71
thewindkee
这个作者很懒,什么都没留下…
展开
-
利用字节码分析a=a++后,为何不会自增
主要就是对本地变量表的数据+1(为2)后,栈顶的1又覆盖了本地变量表的数据,导致a最终仍为1。刚好最近看了《自己动手写Java虚拟机》,对着指令集一行一行分析了一下。群友分享一道题,一看很熟悉,但是不知道怎么解释。具体每一行,看图吧,应该很清楚了。《手把手写Java虚拟机》第4章。原创 2022-10-18 21:00:29 · 1013 阅读 · 1 评论 -
【读书笔记】《自己动手写Java虚拟机》-方法调用
虚拟机执行指令(instruction)步骤:1. 获取当前虚拟机栈顶帧2. 设置程序计数器3. 读取一个字节的操作码(one-byte opcode)以及操作数4. 设置下一跳的程序计数器5. 执行指令6. 循环到第1步骤[^2]原创 2022-09-14 00:48:26 · 576 阅读 · 0 评论 -
SpringBoot+外部Tomcat启动报错 .NoClassDefFoundError: javax/servlet/http/HttpSessionIdListener`
环境Tomcat版本:7.0maven中的servlet-api版本为3.1.0 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> <version>3.1.0&l原创 2021-07-02 17:23:14 · 5861 阅读 · 3 评论 -
mybatisplus报错:getSqlFirst
错误com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not use this method for "getSqlFirst"涉及的代码query=lambdaQuery().eq(User::getId,id);page(new Page(1,20),query);原因正确写法应该是lambdaQuery().eq(User::getId,id).page(new Page(1,20);page方法虽然可原创 2021-03-26 19:22:06 · 6919 阅读 · 1 评论 -
使用mybatis-plus的分页拦截器(PaginationInterceptor)分页失败
背景项目中使用到了mybatis-plus的3.0.5版本,分页拦截器是PaginationInterceptor。代码如下: @Transactional(readOnly = true) public void test() { int current =1; while (true) { final LambdaQueryWrapper<Foo> query = Condition.<Foo>lambda原创 2021-03-16 01:28:58 · 6827 阅读 · 0 评论 -
Arthas实用案例
1.查询Mybatis执行的sql:经常不知道mysql执行的什么语句,可以用如下语句去监控mysql的执行语句。注意UPDATE 即代表 更新。 SELECT 同理。watch org.apache.ibatis.mapping.BoundSql getSql -n 5 'returnObj' 'returnObj.indexOf("UPDATE")!=-1'这里returnObj是观察了返回值TODO...原创 2020-12-09 15:16:49 · 3228 阅读 · 0 评论 -
Arthas使用-wath与tt入门
介绍Arthas 是Alibaba开源的Java诊断工具,可以用于线上快速定位问题。对于我呢,常常直接用来还原事故现场。比如,异常发生时,又没有记录足够的日志。使用watch与TT排查下载maven仓库Github Releases页启动java -jar arthas-boot.jar启动后选择要观察的java进程。选择应用java进程:$ $ java -jar arthas-boot.jar*> [1]: 35542[2]: 71560 arthas-demo.jar原创 2020-09-30 01:56:34 · 4050 阅读 · 0 评论 -
《Java多线程编程实战指南-设计模式篇》笔记
线程池大小1.CPU密集型:考虑设置 Cpu数+12.I/O密集型:考虑设置 2*Cpu数线程泄漏(Thread Leak)含义:指线程池中的工作者线程意外中止,使得线程池中实际可用的工作者线程变少。如果线程泄漏持续存在,那么线程池中的工作者线程会越来越少,导致线程池无法处理交给其的任务。例子:SocketInputStream.socketRead0引起线程池提交任务后,futureTask.get超时正确的预防方式1.处理可恢复的异常。2.设置超时等待。...原创 2020-05-31 23:52:34 · 234 阅读 · 0 评论 -
Netty中遇到的问题:ctx.writeAndFlush造成非连续的请求
目的为了保证客户端的请求是顺序发送到服务端的,ctx.writeAndFlush被包装在用synchronized修饰的send方法中,客户端统一调用sendRequest方法。有多个线程使用sendRequest方法1.eventLoop处理channelRead的结果,并调用sendRequest发送到服务端。2.业务线程(如心跳线程,http请求对应的线程)去调用ctx.writeA...原创 2020-02-20 20:20:36 · 5432 阅读 · 0 评论 -
【内存泄漏】测试ThreadLocal--gc后引发的threadLocalMap的key为null,但value不为null的情况
效果gc后key为null,但是值不为null。需要注意的是,这里threadLocal本身还是存在的。只是传入到Entry中的key被回收了。原因ThreadLocal#set后会将threadLocal实例本身作为key 放入 Thread.currentThread().threadLocalMap中,与set的value构成一对Entry。而Entry使用了threadLocal的...原创 2019-12-27 10:14:31 · 9748 阅读 · 13 评论 -
Druid 的 WallFilter 抛出 sql injection violation, comment not allow 问题的解决方法
ps: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter可以对应修改参数。 如需要执行多行语句 , 要设置multiStatementAllow为true1 现象查询某个模块数据时,抛出以下异常:Caused by: java.sql.SQLException: sql inje...转载 2019-12-02 17:48:44 · 4313 阅读 · 0 评论 -
Elasticsearch+Spring定时任务报错【not be the scheduler thread. Reason: [Blocking operation]】
报错java.lang.AssertionError: Expected current thread [Thread[scheduler-5,5,main]] to not be the scheduler thread. Reason: [Blocking operation] at org.elasticsearch.threadpool.ThreadPool.assertNotSche...原创 2019-11-26 16:44:35 · 269 阅读 · 0 评论 -
《Java性能优化权威指南》学习笔记
编译编译是指生成机器码 即 二进制目标文件的过程。Java最初是转换为类文件,虚拟机将其转为字节码。运行时动态的转为机器码。JIT会在运行时,将调用次数超过阈值CompileThreshold的代码编译(由方法调用计数器计数)。JVM性能监控重要的垃圾收集数据堆大小。新生代、老年代、永久代大小Minor GC /Full GC 的持续时间、频率、空间回收量打印垃圾收集信息 -X...原创 2019-10-25 14:47:03 · 368 阅读 · 0 评论 -
强引用、软引用、弱引用、虚引用测试
强引用/** * 除非GC Roots不可达,否则宁愿OOM也不回收引用 * 启动参数: * -Xmx16m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:NewSize=2m -XX:MaxNewSize=2m */private static void strongRefenceTest() { final int _8M ...原创 2019-10-24 15:35:49 · 710 阅读 · 0 评论 -
一次OOM分析-ByteArrayOutPutStream#write引起
本文产生的原因上传一个大文件文件的时候报了OOM查看代码以前的上传代码中使用了URL url = new **URL**(urlStr);conn = (HttpURLConnection) url.openConnection();....省略out = conn.getOutputStream();conn.setRequestMethod("POST");conn.con...原创 2019-10-23 17:20:31 · 4699 阅读 · 0 评论 -
URLConnection 使用流的问题
URLConnection 使用流的问题HttpURLConnection con = (HttpURLConnection)new URL("url").openConnection(); //若不进行下面两种设置 会使用PosterOutputStream extends ByteArrayOutputStream将所有加到内存中输出。如果传输数据过大, 会导致OutOfMemoryE...转载 2019-10-23 11:29:19 · 539 阅读 · 0 评论 -
【java基础】为何e1==(e1=e2)为false
代码如下public class Exercise { static void print(Exercise e1,Exercise e2) { System.out.println(e1==(e1=e2)); } public static void main(String[] args) { Exercise e1 = new Exercise(); Exer...原创 2019-02-12 18:21:32 · 1008 阅读 · 3 评论 -
《Java高并发编程详解-多线程架构与设计》线程间的通信
摘自《Java高并发编程详解-多线程架构与设计》第五章同步、异步、阻塞、非阻塞概念同步和异步结果的通知机制。自己问还是别人通知。同步:主动等待结果的返回。如阻塞等待,轮询(同步非阻塞)。异步:被动等待结果的返回。如 消息回调。阻塞和非阻塞结果返回以前,调用方的状态。等还是不等。阻塞:结果返回以前,什么也不干。非阻塞:在结果返回以前,可以先做一些其他事情。Monitor锁下...原创 2019-07-07 16:30:44 · 436 阅读 · 0 评论 -
《Java高并发编程详解-多线程架构与设计》线程安全与数据同步
定义共享资源:多个线程对同一资源访问(读写)线程安全:多个线程对同一资源访问的数据是一致的。Synchronized使用同步方法同步代码块深入 synchronized关键字p66-67不应该叫synchronized(mutex)为锁,而应该是某个线程获取了与mutex关联的monitor锁。当使用synchronize锁住某段代码, 几个线程一起去访问时。使用jstack查看...原创 2019-07-07 16:14:43 · 299 阅读 · 0 评论 -
《Java高并发编程详解-多线程架构与设计》Thread API
摘自《Java高并发编程详解-多线程架构与设计》第三章1.sleep不会释放monitor锁的所有权2.使用TimeUnit.XX.sleep代替Thread.sleep3.yield让出CPU资源4.yield与sleep的区别jdk1.5之前 yield 实际调用sleep(0)sleep 会暂停线程指定时间, 没有时间片的消耗yield只是对cpu一个hint,cpu调度...原创 2019-07-21 01:15:51 · 1463 阅读 · 0 评论 -
minor GC 、 full GC、新生代(young )、老年代(old)的一些理解
Minor GCMinor GC是俗称,新生代(新生代分为一个 Eden区和两个Survivor区)的垃圾收集叫做 Minor GC。 清除 Eden 和 from ,转到to中。接下来from与to转换。继续清除 Eden和新from,转到to。清除一次后存活超过年龄的 ,转到老年代。to到了阈值后,部分对象转到老年代。晋升老年代参数:XX:+MaxTenuringThreshold(至...原创 2019-05-30 23:02:12 · 8912 阅读 · 1 评论 -
对Java内存模型的一些理解
线程私有:程序计数器、虚拟机栈、本地方法栈程序计数器:记录了程序执行的字节码的行号和指令,方便线程切换。虚拟机栈 :局部变量表(原生类型、引用类型),方法调用栈 --平时说的栈。可抛出StackOverflowError异常和OutOfMemoryError本地方法栈则是为虚拟机执行Native方法服务的。线程共享:堆、方法区等。堆(java Heap):新生代和老年代;再细致...原创 2019-05-30 22:44:04 · 610 阅读 · 0 评论 -
《Java程序性能优化》3.3 使用NIO提升性能
p:102-118流与NIO的不同流以字节为单位,NIO基于块(block)为单位。channel是双向的通道。stream是单向的。NIO组件NIO两个重要组件:通道channel和缓冲buffer通道表示缓冲数据的源头或者目的地。缓冲是一块连续的内存, 是NIO读写数据的中转地。通道(Channel)不能直接对channel进行读写操作,必须通过Buffer来进行。如: 在...原创 2019-04-18 14:14:51 · 279 阅读 · 0 评论 -
java获取汉字笔画数
转自:https://blog.csdn.net/baidu_18987603/article/details/53375195?tdsourcetag=s_pcqq_aiomsgjava获取汉字笔画数前段时间做个项目,主要是中文验证码识别,分为了几类问题,一类是得出某个汉字的笔画数,在网上搜了一下,基本方法都是大同小异,都是通过查GB2312的字符集的笔划列表。下面给出源代码。稍有更...转载 2019-02-20 17:42:32 · 2387 阅读 · 0 评论 -
记录一次@Around使用不正确造成的StackOverflowError
同事发了一个底层服务后。我负责的某个上层服务突然挂了,有点慌,马上查看上层服务的日志。查看日志特别长。没找到从哪儿报的。 跳到最上开始找,结果: StackOverflowError。就想到了递归调用。随即找到相关代码一看: 由于doSomething方法也被@Around拦截,因此,一旦service下某个方法被拦截进入doAround,就会调用other.doSom...原创 2019-02-20 09:44:38 · 524 阅读 · 0 评论 -
线程oom后进程里其他线程还能运行吗?
参考 【原创】一个线程oom,进程里其他线程还能运行吗?结论线程OOM不会影响其他线程运行。原因OOM异常发生于具体的线程上,受影响的线程局限于抛出异常的线程。且OOM后,受影响的线程因异常而退出,只被该线程所持有的资源不可达后,GC自动回收资源。效果如图启动参数-XX:+PrintGCDetails -Xmn16m -Xmx32m -XX:+HeapDumpOnOutOfMemor...原创 2019-06-28 01:23:44 · 1523 阅读 · 0 评论 -
栈应用-中缀表达式转后缀表达式并计算值
表达式的三种形式:中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3。我们从小做数学题时,一直使用的就是中缀表达式。后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 。又比如3+(6-4/2)5=23的后缀表达式为:3642/-5+# (#符号为结束符)前缀表达式:同后缀表达式一样,...原创 2019-07-10 14:42:07 · 426 阅读 · 0 评论 -
《Java高并发编程详解-多线程架构与设计》Java Classloader
摘自《Java高并发编程详解-多线程架构与设计》第九章 p144-p157重点:1.连接-准备阶段为静态变量赋初值,初始化阶段为静态变量赋代码值2.引起初始化阶段的6种情况(主动引用),静态变量/方法,new,反射,子类引起父类。以及被动引用,如静态常量。其值opy到被引用的类。3.类加载的三个阶段4.静态代码块可以对后面的静态变量赋值,但不能访问。5.clinit线程安全1.类...原创 2019-07-24 12:00:32 · 842 阅读 · 0 评论 -
Base64编码转图片
今天在群里,有人问 富文本的图片怎么上传。想了下, 这里的base64后面的那一串数据就是 图片被base64编码了而已。因此把这个字符串用base64解码成字节数组, 再用FileOutputStream输出成对应格式的图片就可以了,这里是png,那么就保存成png。import java.io.FileOutputStream;import jav原创 2016-06-21 18:13:17 · 14069 阅读 · 0 评论 -
keepAliveTime为0以及队列太小导致ThreadPoolExecutor不断创建新线程
产生原因群友问题:使用ThreadPoolExecutor实现固定大小的线程池,但是程序跑一段时间后,就会重新创建新的线程,求问有人遇到过这个问题吗?询问工作队列,最大线程数,超时时间参数值设置猜测怀疑 keepAliveTime为0,导致runWorker期间,getTask不等待。线程池new ThreadPoolExecutor(corePoolSize, max...原创 2019-08-12 18:24:02 · 3242 阅读 · 0 评论 -
SocketInputStream.socketRead0引起线程池提交任务后,futureTask.get超时
文章目录现象结论相关代码查看堆栈:查看submitCallThreadPoolExecutor#execute最终调用了 RunnableFuture#run方法从代码层面判断 futureTask.get超时只影响了业务线程(调用futureTask.get的线程),不影响工作线程。future.get测试future.get并不能打断线程池的线程。查看工作线程为何阻塞修复现象线上发短信、邮...原创 2019-08-07 11:04:05 · 1528 阅读 · 0 评论 -
SpringAop时Null return value from advice does not match primitive return type for: public int...异常
原因接口是返回基本类型(primitive),切面拦截后返回了null。Null return value from advice does not match primitive return type for: public int …模拟proceed异常后,obj将是null。这里手动处理了null值,避免更优雅的方式1接口使用包装类而不是基本类型。更优雅的方式2避免在...原创 2019-08-13 15:12:40 · 15311 阅读 · 1 评论 -
线程池中的线程何时死亡?
文章目录本文产生的原因结论Thread线程状态线程池中提交任务threadPoolExecutor#execute(runnable)addWorker(firstTask)线程状态new: newWorker(command)->getThreadFactory().newThread(this)线程状态runnable:worker.thread.start()线程状态running:w...原创 2019-08-02 11:40:35 · 4967 阅读 · 5 评论 -
AppClassLoader
疑问为何 继承ClassLoader的自定义类加载器默认会调用super()传入默认的AppClassLoader作为parent?带着这个疑问 , 查看了下URLClassLoader的源码根据URLClassLoader继承了ClassLoader,URLClassLoader类加载器的实例隔离Class对象中MyClassLoader隐式的调用了super()ClassLoa...原创 2019-07-27 16:58:35 · 2496 阅读 · 0 评论 -
《Java高并发编程详解-多线程架构与设计》JVM类加载器
总结内置类加载器 bootstrap ClassLoader,Ext ClassLoader ,App ClassLoader。分别加载jre\lib,jre\lib\ext,-cp或者-classpath对应的classpath通过继承ClassLoader重写findClass特殊目录来实现自定义类加载器。特殊目录或者设置父加载器为空,让loadClass时跳过父类加载器(ps,如...原创 2019-07-21 01:14:24 · 477 阅读 · 0 评论 -
Tomcat的类加载器初步认识
起因查看Tomcat的Bootstrap启动时创建了Common ClassLoader,实质是一个指定目录的URLClassLoader指定目录根据URLClassLoader继承了ClassLoader,ClassLoader.getSystemClassLoader()获取系统默认ClassLoader的方法Launcher 去获取 ClassLoader返回的t...原创 2019-07-24 00:45:28 · 142 阅读 · 0 评论 -
CountDownLatch模拟田径赛跑
得一面试题,正好用来练手现有一场田径比赛,共有8个选手参赛。他们编号分别为: A,B,C,D,E,F,G,H; 赛事观察员分别在开始后 20s和30s拍下两张照片,各个选手的排名情况如下, 20s:F,A,H,G,C,B,E,D;30s:G,H,A,C,F,D,B,E;请你写出一个程序, 模拟出这些参赛选手在20-30s这10s的内排名变化,每1s显示一次排名。主要是考察countD...原创 2019-07-19 01:23:18 · 954 阅读 · 2 评论 -
《Java程序性能优化》subString()方法的内存泄露
String的构造首先了解下String的构造,String内部使用char [] value 来存储字符。需要注意 offset和count在1.7已经没有了。 /** The value is used for character storage. */ private final char value[];/** The offset is the first index o...原创 2019-01-31 15:16:19 · 1356 阅读 · 0 评论 -
线程池ThreadPoolExecutor参数设置
转自:https://blog.csdn.net/zhouhl_cn/article/details/7392607JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同时,对于该线程池不恰当的设置也可能使其效率并不能达到预期的效果,甚至仅相当于或低于单线程的效率。ThreadPoolExecut...转载 2018-07-19 13:58:46 · 325 阅读 · 0 评论 -
关于Jsp ${param.xx}取出request.getParameter("xx")
今天同事问起, 才发现有这种写法。 一番查询发现:这是因为 pageContext里面有很多隐式对象。其中包含了param,header,cookie对象。 param对象是包含了request中paramter的Map。oracle文档有提到。The Java EE 5 Tutorial > Part II The Web Tier > Chapter 5 JavaServer ...原创 2018-07-11 13:54:44 · 578 阅读 · 0 评论