Java修炼之旅
文章平均质量分 72
自己学习java的一些记录与想法
我想问问天
欢迎访问我的github地址:https://github.com/wxwwt
segmentfault:https://segmentfault.com/u/wxwwt
公众号:我想问问天(关注领取学习资料)
展开
-
JVM-对象头了解一下?
在《深入Java虚拟机》第三版的第二章里面有讲到关于对象的内存布局的知识,今天我们就来聊一聊这里面的对象头,并且会对创建对象,对象头里面的信息变化做一个实践的程序练习。原创 2022-11-16 22:27:46 · 394 阅读 · 0 评论 -
JVM-对象头了解一下?
在《深入Java虚拟机》第三版的第二章里面有讲到关于对象的内存布局的知识,今天我们就来聊一聊这里面的对象头,并且会对创建对象,对象头里面的信息变化做一个实践的程序练习。首先我们要知道对象在内存的布局是什么样子?对象的内存布局可以分为三块:了解了对象的内存布局之后,我们开始讲markWord储存的信息,markWord在32位和64位系统中的长度是32和64,如果64位系统开启了压缩指针的话,那也是32位。查看jvm默认参数:java -XX:+PrintCommandLineFlags -versio原创 2022-11-16 22:25:49 · 489 阅读 · 0 评论 -
类加载的思维导图
来自于学习《深入理解Java虚拟机》的第七章做的思维导图,,还有部分验证加载过程的。原创 2022-07-24 21:07:12 · 132 阅读 · 0 评论 -
Java接入sqlserver的一些坑点记录
jdbc对应的maven版本:网上搜索出来的资料有两种,一种是比较老版本的这个版本我去maven的主仓库查了下,更新时间是2016年3月份,所以最好就别用这个老版本的包了。推荐使用:另外一种是船新版本的driver2.Java对应sqlserver驱动名称驱动名称:发现很多网上写的都是com.microsoft.jdbc.sqlserver.SQLServerDriver,申明这个名称在10.2.1版本是错的,正确的是com.microsoft.sqlserver.jdbc.SQLServerDri原创 2022-06-22 13:24:21 · 1063 阅读 · 0 评论 -
jdbc和mybatis的流式查询使用
导语:有些时候我们所需要查询的数据量比较大,但是jvm内存又是有限制的,数据量过大会导致内存溢出。这个时候就可以使用流式查询,数据一条条的返回,处理完一条在拿下一条数据,这样每次在内存里面的数据其实很小,不会导致内存溢出。本文里面会讲到jdbc的流式查询和mybatis的流式查询。jdbc流式查询:jdbc的流式查询需要在生成PreparedStatement的时候设置三个参数。如下:PreparedStatement stmt = jdbcTemplate.getDataSource().ge原创 2021-12-18 18:42:56 · 1737 阅读 · 0 评论 -
JUnit5的新特性
前言:JUnit5比4增加了很多新特性,最近刚使用了一下JUnit5记录一下看到和使用了的新特性,先看下JUnit5的的包结构JUnit5的包结构:JUnit5和4开始支持的java版本也不一样,JUnit4需要Java 5或更高版本,JUnit 5需要Java 8或更高版本。新特性:1.断言在Junit4中,org.junit.Assert具有所有断言方法来验证预期结果和结果。例如:public static void assertEquals(long expected, long原创 2021-01-17 23:16:25 · 224 阅读 · 2 评论 -
jenkins自动部署maven项目
导语: 打包部署对于后端程序员来说是日常工作中很常见的一件事情,有的是手动本地打包在推送到服务器上部署,有的是在服务器上拉取对应分支代码在打包部署,这样的流程不够自动化,而且在要部署多台服务器这些重复的劳动会占用很多时间。这个时候咱们可以使用jenkins或者类似自动化发布部署的软件来给咱们减少重复劳动,节省时间,可以有更多的时间来做更有创造性的事情。部署步骤:前提: 1.服务器已安装好jdk (本文是安装的jdk8) 2.服务器已经安装原创 2021-01-03 22:09:02 · 803 阅读 · 0 评论 -
ScheduledExecutorService出现异常挂掉的问题
导语:最近遇到一个问题,有个周期给业务方推送信息的功能,突然就没推送了。日志里面也没有查询到报错的信息,然后检查代码发现原来写这个推送功能用的是ScheduledExecutorService,再设定好执行时间,就会周期性去用ScheduledExecutorService的子线程来执行任务。问题排查:问题的原因最后发现是某些配置修改了,导致运行推送任务的子线程在执行的时候回抛出异常,但是这个线程池是不打印子线程的异常信息的,所以日志里面根本看不到报错的信息。测试例子:写一个简单方法,直接子原创 2020-12-20 23:08:29 · 1660 阅读 · 4 评论 -
微服务架构解决了什么问题
引语:学习了沈剑老师的《微服务架构究竟解决了什么问题》课程,记录一下学习笔记。现在基本上互联网公司招人就是问微服务,那么为什么要用微服务架构?它究竟解决了什么问题?有什么好处和缺点呢?课程里有一句话很有感触就是不能大家都在用什么技术你就要用什么技术,应该是要了解它的优势和缺陷,对于合适的场景使用合适的技术架构。传统互联网架构的问题先看下典型的互联网架构。方式一:从客户端到反向代理,再到高可用的web集群,web服务在直接访问db集群。方式二:应用服务和dao,数据库都放在同一台服务器上然后原创 2020-12-06 22:15:45 · 1713 阅读 · 0 评论 -
创业公司自动化上线的架构设计
导语:晚上听了58沈剑老师的自动化上线的课程的一些分享,记录下笔记和一些思考,这要是讲了从创业公司的手动发布到自动化发布的架构和设计。1.起源问题的提出:如何把新系统发布到线上?不同公司的阶段有着不同的策略和方式如下图:对于创业公公司来说对于研发工程师往往是多面手,很多时候部署就是自己操作的。发布代码非常繁琐和麻烦,工程师会花费大量的时间在这些重复性的劳动上面。这里就是问题的所在,应该解放工程师去做更多有意义的事情,从重复性劳动中解脱出来。2.创业公司会遇到的困难困难如下图:创业公司原创 2020-11-16 00:43:42 · 274 阅读 · 0 评论 -
maven导入snapshot依赖找不到对应类
导语:最近在做项目的时候,引入公司编写的二方库的包,maven仓库也deploy上去了。然后编译代码的时候发现一直找不到一个类,就编译不通过。一开始以为是本地idea或者maven的缓存导致没有拉取到最新的包。后来经过一系列的无用操作,发现了问题的所在是二方库的snapshot生成有个时间戳导致找不到。下面来看一下解决的过程:解决步骤:1.首先确认了二方库的版本和项目引入的二方库的版本是不是一致的,结果发现版本是没有问题的2.确认二方库的包是不是真的传到maven仓库了,直接从maven的私服去原创 2020-11-01 21:25:16 · 1833 阅读 · 1 评论 -
大型网站技术架构的演变历程
最新看了《大型网站技术架构》的一些内容,记录一下网站演变的进程和一些感悟。演进历程:1.初始阶段的网站架构这种网站的初创时期,一台服务器就充当了所有的角色,应用程序,数据库,文件等内容都部署在上面,很多个人开发者可能也就是这样部署的,还有可能媒体文件也是放到数据库里面的。流量不大,所以也没什么压力和问题。2.应用服务和数据服务分离随着网站的发展,我觉得这个确实是必然的,书中也说了对于应用服务器和数据服务器,服务器的硬件需求其实是不一样的。应用服务器需要大量的计算,提供稳定的服务,需要高性能的C原创 2020-10-26 23:32:15 · 208 阅读 · 0 评论 -
遍历list时删除元素发生了什么?
导语:最近写了一个bug就是在遍历list的时候删除了里面一个元素,其实之前看过阿里的java开发规范,知道在遍历的时候删除元素会产生问题,但是写的快的时候还是会没注意到,那正好研究下里面的机制看。我们看看阿里规范怎么写的:首先提出一个概念:fail-fast摘自百度百科:fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作...原创 2020-04-14 23:25:53 · 687 阅读 · 0 评论 -
大白话btree和b+tree
引语作为一直后端程序猿,经常会看到好几个关于树的概念,平衡二叉树,二叉搜索树,avl树,btree,b+tree等等。没有弄清楚的时候,放到一起很容易弄混。今天咱们就来捣鼓捣鼓这几个名词,理解一下它们都是啥。本文会从二叉树由浅入深介绍到b+tree,,对于不同的树的插入删除先不谈,主要用于帮助不清楚概念的童鞋理解这些名词代表的什么样的数据结构,暂不涉及红黑树(这玩意要写起来篇幅有点长,下次可...原创 2020-03-08 23:06:43 · 2047 阅读 · 0 评论 -
STS临时授权访问OSS你知道了吗
前言最近在做跟oss上传相关的一些东西,一开始方案是前端直接上传,oss的key,secret都由前端自己配置。但是这样会存在一些安全问题,如果这个账号的账密被泄露了,权限没有做控制的话。不法分子就可以对我们的oss上的文件进行各种操作,删除啊,下载之类的。既然有这种安全问题,咱们肯定是要解决的。经过查看官方文档知道,阿里云oss支持使用临时token的方式,前端或者说上传者只要拿到了这个t...原创 2020-02-16 23:40:27 · 2152 阅读 · 0 评论 -
java的深拷贝和浅拷贝了解一下
我们知道拷贝就是生成一个新对象和原对象一模一样,但是拷贝也是分方式和程度的,我们来看一下什么是浅拷贝什么是深拷贝浅拷贝在Java中,java.lang.Object类的clone()方法用于克隆(浅拷贝,属性的指向是相同的)。该方法创建一个对象的副本,并通过逐字段分配在其上对其进行调用并返回该对象的引用。要实现浅拷贝需要实现Cloneable接口,该接口里面没有任何方法,它指向的是java...原创 2020-01-20 17:08:01 · 173 阅读 · 0 评论 -
并发编程笔记2_synchronized使用和注意事项
前言:上一篇学习了并发bug的成因,我们知道当一个线程的时间片使用完的时候,操作系统就会切换到另外一个线程,如果这两个线程访问了相同的资源,可能就会导致并发问题。我们可以想到如果这个共享的资源一次只能一个线程访问,其他线程不能访问的话,就不会因为切换线程而产生的问题了。java并发编程中就提供了这样的机制,互斥锁来保证一次只有一个线程能访问共享的资源。java中有synchroized和lo...原创 2019-11-24 22:43:17 · 137 阅读 · 0 评论 -
浅析Hotspot JIT编译
1. 什么是编译? 像java,C语言这些高级程序语言,计算机并不能直接执行.计算机认识的是汇编或者机器语言,是可以直接由计算机直接执行的.所以从高级语言转化为计算机认识的低级语言的过程叫做编译. 上图是javac编译的过程,编译完成后会生成字节码,也就是.class文件...原创 2018-07-01 18:28:55 · 725 阅读 · 0 评论 -
jvm oop-klass对象模型
jvm对象模型可以从hotspot7的源代码中学习.本文内容都是以jdk7对应的hotspot虚拟机为基础进行分析的.一.oop-klass的层级关系 首先,从oopsHierarchy.hpp的源代码.看看jvm对象模型的层次结构. 引用Hotspot实战里面的一张图,oop各模块的组成: oop层级部分: klass层级部分: 二.oop层级部分: 看完了jvm整个...原创 2018-06-10 22:51:49 · 8064 阅读 · 0 评论 -
用maven打包含依赖的jar包
今天给同学做一个excel处理的小工具的时候,因为同学不懂编程,又不想安装过多的环境什么的,就决定采用jar包的形式,让他在cmd中运行这个小工具.遇到的问题:直接生成jar包,并且运行的是jar中的main方法. 采取的解决方式:用maven生成包含依赖的jar包,并且指定运行jar的时候,用哪一个方法作为程序的入口.1.在maven项目中的pom.xml添加插件maven-assembly-p原创 2018-01-01 23:43:15 · 607 阅读 · 0 评论 -
注解处理器是干嘛的
注解处理器初探 平时做项目中有个非常好用的一个插件,叫lombok.它提供了一些简单的注解,可以用来生成javabean和一些getter/setter方法,提高了开发的效率节省了开发时间.今天我们就来看看lombok使用的什么方式来实现这种操作的.其实lombok使用的是annotation processor,这个是jdk1.5中增加的新功能....原创 2019-07-14 19:01:39 · 1004 阅读 · 1 评论 -
怎么重复使用inputStream?
引语: 之前做项目的时候遇到一个问题,就是从网络中读取的图片要上传到oss,而且要对图片进行裁剪和压缩,其中上传和裁剪都要使用到图片的inputStream,又因为inputstream不能重复读,导致裁剪是成功的,而上传是失败的.我们今天就提供两种方法来解决,inputStream不能重复读的问题.问题分析:inputStream的内部有个p...原创 2019-06-30 22:06:29 · 1233 阅读 · 0 评论 -
Arrays.asList存在的坑
引语:阿里巴巴java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException(),我们来看一下为什么会出现这种情况.问题分析:我们做个测试public static void main(String[] args) { L...原创 2019-06-24 23:03:56 · 235 阅读 · 0 评论 -
普通对象使用spring容器中的对象
引语: 工作中有时候需要在普通的对象中去调用spring管理的对象,但是在普通的java对象直接使用@Autowired或者@Resource的时候会发现被注入的对象是null,会报空指针。我们可以简单的理解为spring是一个公司,它管理的对象就是它的员工,而普通的java对象是其他公司的员工,如果其他公司要找spring公司的员工一起共事没有经过...原创 2019-06-02 21:26:10 · 658 阅读 · 0 评论 -
java四种引用简介
引语: 我们知道java相比C,C++中没有令人头痛的指针,但是却有和指针作用相似的引用对象(Reference),就是常说的引用,比如,Object obj = new Object();这个obj就是引用,它指向的是真正的对象Object的地址,不过今天要说的是java中的四种引用。有人可能比较懵逼,四种引用?是的,从JDK1.2之后,java...原创 2019-05-26 17:23:56 · 665 阅读 · 1 评论 -
springboot整合quarzt实现动态定时任务
springboot整合quarzt实现动态定时任务实现定时任务的几种方式:1.使用linux的crontab2.使用spring自带的ScheduledExecutor3. 使用JDK自带的Timer4.使用quarzt整合步骤:遇到的坑:源码地址:[github源码地址](https://github.com/wxwwt/dynamic_scheduler),朋友们觉得写得还行的帮忙star个...原创 2019-05-12 16:26:21 · 3504 阅读 · 1 评论 -
记一次线上频繁FGC的事件和解决方式
问题描述:    早上去公司上班,突然就邮件一直报警,接口报异常,然后去查服务器的运行情况,发现java的cpu爆了.接着就开始排查问题问题解决过程:1.先服务器(centos7)上,使用了top和uptime命令,发现时java的cpu爆了,超过100%了,导致后续的服务无法正常提供;2.调整了负载均衡,下掉了有问题的那几台机器;3.使用jps找...原创 2019-03-10 23:50:35 · 1734 阅读 · 0 评论 -
HttpServletRequest的getParameter()的坑
问题:做项目的时候和对接方联调的时候,对接方会传入一个url给我们,然后经过一系列的操作之后,我们会将一些参数返回到该url上,回调给对接方.然而当使用了getParameter获取传入的url的时候发现,获取的url并不是对接方传入的完整的url. 例子:对接方传入url=http://abc.com/#/result/success这样类似的url,我们返回的是http://abc.co...原创 2018-04-13 01:01:43 · 19426 阅读 · 0 评论 -
反射交换两个值的大小引发的思考
发现问题:最近在学习java的时候在java群里面看到一个问题,就是用反射来实现两个值的交换,然后结果没有按群友的预期去执行.群里的代码如下: 群友想的结果是a=1,b=2;a=2,b=1; 然而结果是 然后就觉得很奇怪,交换完以后,a,b都变成了2.问题探究过程(和群友一起讨论出来的,一开始自己也觉得很奇怪,涉及到java的自动装箱和Integer类的源码设计问题)...原创 2018-03-28 01:21:57 · 386 阅读 · 0 评论 -
Zlib压缩实践例子
前言: 之前做项目的时候,遇到这么一个问题,对接方对推一些单子给我方的接口,而且数据内容很大,平均一条有10M左右.然后我们经过解析等处理以后存入数据库,随着每天项目的运行,数据量越来越大,导致了解析过程很慢,数据存储越来越大,导致磁盘空间不足.ps:一开始用的text,后来发现长度不够用,变成了mediumtext.于是,我们项目组考虑了一些方案.下面的内容是我自己想出来的方案中的一个原创 2018-01-14 17:37:27 · 1730 阅读 · 0 评论 -
JVM运行时数据区域学习
注: 1.本地方法栈和虚拟机栈并非所有的JVM都有区分,不是强制规定,HotSpot中本地方法栈和虚拟机栈是合在一起的; 2.方法区不等于永久代,HotSpot使用永久代来实现方法区,但在其他的JVM中并不适用; 3.一般来说,对象实例和数组都在...原创 2018-05-27 18:05:59 · 265 阅读 · 0 评论 -
JVM的基本原理
一、类加载器首先来看一下java程序的执行过程。 从这个框图很容易大体上了解java程序工作原理。首先,你写好java代码,保存到硬盘当中。然后你在命令行中输入[java] view plain copyjavac YourClassName.java转载 2016-04-16 10:28:14 · 377 阅读 · 0 评论 -
instanceof关键字的实现原理浅析
概念和用法:    instanceof关键字,也可以叫做类型比较运算符,在java中是用来判断一个类是否是另一个类的实例。    用法: boolean object instanceof class   &原创 2018-11-26 08:50:52 · 1781 阅读 · 0 评论 -
Java中的join(),yield()解读
前言:多线程中让线程等待的方法有很多种,下面我们就来分析一些这些方法的作用和区别.1. public static native void yield();1.1 源码注释翻译:    (1). 向调度程器发起一个示意,表明当前线程乐意去放弃当前使用的处理器.调度器可以忽略这一提示.    &am原创 2018-09-01 18:30:10 · 9470 阅读 · 0 评论