Resive world

Come world to Record life


  • Home

  • Tags

  • Categories

  • Archives

  • Sitemap

  • Search

「深入JVM」内存模型JMM 与 锁机制

Posted on 2019-08-27 | In JVM

Java 内存模型(Java Memory Model)

Java Memory Model(JMM)描述了 Java 程序中各种变量(线程共享变量)的访问规则,以及在 JVM 中将变量存储到内存中和从内存中读取变量这样的底层细节(可见性,有序性,原子性)。

  • 所有的变量都存储在主内存中
  • 每个线程都有自己的独立的工作内存,里面保存该线程使用到的变量的副本(来自主内存的拷贝)
  • JMM 规定: + 线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写。 + 不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来完成。
    Read more »

「深入JVM」 类文件结构 与 类加载机制

Posted on 2019-08-25 | In JVM

1. 类文件结构

Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据严格按照顺序紧凑的排列在 Class 文件中,中间无任何分隔符,这使得整个 Class 文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当遇到需要占用 8 位字节以上空间的数据项时,会按照高位在前的方式分割成若干个 8 位字节进行存储。
Java 虚拟机规范规定 Class 文件格式采用一种类似与 C 语言结构体的伪结构体来存储数据,这种伪结构体中只有两种数据类型:无符号数和表。

Read more »

「深入JVM」 运行时数据区 与 垃圾回收机制

Posted on 2019-08-23 | In JVM

Java 虚拟机运行时数据区

  1. 程序计数器(Program Counter Register)
  2. 本地方法栈(Native Method Stack)
  3. Java 虚拟机栈(VM Stack)
  4. Java 堆(Heap)(线程共享)
  5. 方法区(Method Area)(线程共享)
    Read more »

「数据结构」常见JAVA集合类的数据结构分析

Posted on 2019-07-28 | In 数据结构

集合(Collection/Map)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Collection接口
|———— List接口
|———— ArrayList类
|———— Vector类
|———— LinkedList类
|———— Stack类
|———— Set接口
|———— HashSet类
|———— TreeSet类
|———— LinkedHashSet类
|———— Queue接口
|———— LinkedList类
Map接口
|———— HashMap类
|———— TreeMap类
|———— LinkedHashMap类
|———— Hashtable类
Read more »

「网络协议」网络协议基础

Posted on 2019-07-15 | In 网络协议

1. 分层网络协议

  1. OSI七层网络协议:物理层,数据链路层,网络层,传输层(TCP/UDP),会话层,表示层,应用层
  2. TCP/IP协议分层(可以理解为OSI的一种实现):网络接口层,网络层,传输层(TCP/UDP),应用层
    Read more »

IntelliJ常用配置备忘

Posted on 2019-04-11 | In Java

前言

最近IntelliJ又由于自己的骚操作给弄崩溃了,导致之前弄的一大波配置又找不到了,十分蛋疼的又要开始重头开始弄环境。很多之前精心搞过的配置又都记不住了,为了防止以后出现这种情况,这里就把我日常用的配置和注意点记一下,免得以后又要重新摸索。尽量持续更新。

安装

安装这块没啥好说的,不过要注意的是,虽然 IntelliJ 有 Community 版,但是毕竟还是少了一些东西的,比如对JavaScript的支持、一些静态检查的支持、Spring框架的整体支持等等。因此还是不要太委屈自己了,安装个正式版然后激活下好了(罪过罪过,实在是正版太贵了)。

配置

修改文件模板

合作写代码的时候,一般都要求在自己创建的文件头加上一些创建者的信息,用以方便交流。

方法是找到下面的路径:File > Settings > Editor > File and Code Templates > Includes > File Header,并修改文件模板:

1
2
3
4
/**
* @author ${USER}
* @date ${DATE}
*/

当然,@date 并不是标准的javadoc注解,不过也无妨了。

修改编辑器样式

人老了,眼神不好,编辑器字体太小的话为了看清楚还要凑上去,对颈椎也不好。

方法找到下面的路径: File > Settings > Editor > Font,并把Size设为一个合适的大小(蛋疼的默认设置竟然是12磅),我现在似乎对16磅的感觉比较舒服,不排除以后用更大的字体。

而且,一般公司的灯光都不错,用白底的主题更舒服。在File > Settings > Appearance & Behavior > Appearance里将Theme调成IntelliJ即可。

自动Import包时少用通配符

一般在 import 其他包的类时,如果来自同一个包的类比较多,IntelliJ 会弄个通配符出来,缩成一行。这样做可以减少文件长度,但是容易把本地的名空间弄混乱,可读性会差一点,因此一般会建议显示 import 所有需要的类而不要用通配符。

方法是找到下面的路径: File > Settings > Editor > Code Style > Java > Imports,并将 Class count to use import with "*" 和 Names count to use static import with "*" 设为一个较大的值。

序列化接口提示自动生成serialVersionUID

序列化的时候如果不指定serialVersionUID,那么实际上每次都要根据类的定义去计算一个UID,这个计算的结果很可能会受编译器的影响,容易导致UID的不一致,出现序列化/反序列化失败。

不知为何 IntelliJ 默认没有增加这个 Inspection ,那我们加一下就好了。

找到下面的路径:File > Settings > Editor > Inspections 。首先把 Profile 设置成Default IDE,这样配置才能在所有项目中应用,否则就只在当前项目中应用。然后在Java > Serialization issues中,找到Serializable class without 'serialVersionUID',并把校验勾上。

增加了 Inspections 告警之后,就可以条件激活时,触发 Intention 的提示,这样就可以使用 alt + enter 直接自动生成UID了。

话说回来,有一个叫GenerateSerialVersionUID的插件也是专门用来做这件事的,不过相比较之下还是直接改下配置更轻量。

指定JavaScript语言

JavaScript的语言特性飚的太快了,为了防止使用新特性报错,需要调一下语言等级。

找到下面的路径:File > Settings > Languages & Frameworks > JavaScript,并将 JavaScript language version 调整为 ECMAScript 6或以上。

插件

对于插件,最好的原则应当是宁缺毋滥。曾经有一段时间我也是一听说有什么新奇的插件都会装来已用,后来发现很多东西到头来根本用不到。其实很多功能 IDEA 本身就已经很强大了,再额外装那些看上去很帅其实并没有什么卵用的插件其实只能把开发环境弄的乱七八糟,各种热键冲突,各种中英文混淆,各种不适配的Bug,反而让人用起来很烦躁。况且很多所谓插件提供的功能,IDEA 本身其实是慢慢都已经支持了。因此与其到处找新插件,倒不如仔细研究一下 IntelliJ 自身已经提供的功能。

这里也顺便吐槽一下很多推荐插件的文章,我反正是完全不相信他们自己会用他们推荐的插件的。

IDE Features Trainer

插件地址: IDE Features Trainer
使用理由: 在刚接触 IntelliJ 的时候,一定要先使用一下这个插件。安装之后可以在View > Tool Windows > Learn里打开练习页。这个插件能非常全面的过一遍 IntelliJ 的快捷键,运用熟练之后开发效率能有很大提升。

Vue.​js

插件地址: Vue.js

使用理由: 对于平时需要使用 Vue.js 开发一些页面的我来说,一个支持 Vue.js 语法的插件当然十分有用了啊,否则就是各种波浪线,很难受的。

VisualVM Launcher

插件地址: VisualVM Launcher

使用理由: 对于需要经常使用 visualvm 来进行性能调优和 debug 的我来说,一个可以直接帮我启动 visualvm 并打开当前正在调试的应用的按钮还是很方便的。

Lombok

插件地址: Lombok

使用理由: 虽然我个人不喜欢用 Lombok ,毕竟这玩意不方便调试,而且容易跟 gradle 和 jdk 产生构建冲突,非常蛋疼。但是鉴于很多同事喜欢用这玩意,导致不装这个东西就根本调试不了他们的代码,所以没辙,这玩意必须得装,没得选。

Alibaba Java Coding Guidelines

插件地址: Alibaba Java Coding Guidelines

使用理由: 阿里的代码规约插件还是能让我们学到一些不错的规范的,在 IntelliJ 自带的 Inspection 的基础上更进一步,可以看成是一种补充。用的时候记得把语言调成英文,食用起来更可口。

CodeGlance

插件地址: CodeGlance

使用理由: IntelliJ 自带的滚动条还是太细了点,文件比较长的时候,想拖动的话还是不太方便的。CodeGlance 能做到在右边加一个类似 VSCode 的缩略图,拖动起来就方便多了。

注意事项

最后是两个最重要的注意事项,当 IntelliJ 没啥响应,总是在做一些后台操作却又无法中止时,可以尝试这两种方法修复:

清除缓存并重启

很多情况下,重启可以解决。如果是 IntelliJ 内部运行的问题,清一下缓存文件也可以解决了。

方法是选择File > Invalidate Caches / Restart,清除 IntelliJ 的缓存并重启。

禁止索引无用文件

如果发现清除了缓存还没用的话,多半是你的文件数太多了,IntelliJ 根本就处理不过来了。出现这个问题的原因是,IntelliJ 需要首先加载并索引项目的文件,但是你的项目中很可能存在太多的本不需要索引的文件,导致 IntelliJ 加载不完。比如在开发前端时下载的node_modules/文件夹之类的。因此我们需要把这一类的文件夹排除在索引名单中。

方法是在File > Project Structure中,找到这类的文件夹并将其标记为橘黄色的Excluded。这样 IntelliJ 就不会索引这些无用的文件了。(没错,这次我就是因为忘记了这个操作才先重装了一下导致配置全部丢失的。)

「Redis」基于Redis的分布式锁实现

Posted on 2019-04-08 | In Redis

SETNX命令简介

  • SETNX key value返回(1:key的值被设置,0:key的值没被设置),将key的值设为value,并且仅当key不存在。
  • 锁的key为目标数据的唯一键,value为锁的期望超时时间点;
  • 基于Redis实现的分布式锁,主要基于redis的setnx(set if not exist)命令;
    Read more »

「Redis」Redis穿透、击穿、雪崩和数据一致性

Posted on 2019-03-27 | In Redis

1. 缓存穿透

访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

  • 解决方案:
    1. 采用布隆过滤器(bloomfilter就类似于一个hash set),使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
    2. 访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。
    3. 接口限流与熔断、降级
    4. 使用互斥锁排队(分布式环境中要使用分布式锁,单机的话用普通的锁(synchronized、Lock))
Read more »

「Redis」深入学习Redis及集群

Posted on 2019-03-20 | In Redis

Redis本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。

Read more »

将你的博客升级为 PWA 渐进式Web离线应用

Posted on 2019-02-18 | In javascript , PWA

什么是 PWA

PWA 全称 Progressive Web Apps(渐进式 Web 应用程序),旨在使用现有的 Web 技术提供用户更优的使用体验。
基本要求

  • 可靠(Reliable) 一方面是指 PWA 的安全性,PWA 只能运行在 HTTPS 上;另一方面是指在网络不稳定或者没网情况下,PWA 依然可以访问。
  • 快速响应(Fast) 快速响应用户的交互行为,并且具有平滑流畅的动画、加载速度、渲染速度和渲染性能等。
  • 粘性(Engaging) 通过添加到桌面以及离线消息推送,能带来用户的第二次访问,并且依靠良好的用户体验吸引用户再次访问。

官网链接:Progressive Web Apps

Read more »
1…171819…58

574 posts
69 categories
286 tags
© 2024 Companyd
Powered by Hexo
|
Theme — NexT.Muse v5.1.4