原创 虛擬機棧【JVM】

JVM-虛擬機棧 1. 作用 虛擬機棧實際上是程序在運行時來記錄方法調用的一個棧, 我們的每一個線程都有一個虛擬機棧,在這個線程裏面沒調用一個方法就有一個棧幀入棧,當一個方法調用完成這個棧幀就出棧;直到最後一個棧幀出棧整個線程的

原创 堆【JVM】

JVM-堆 1. 堆的作用 堆的作用其實就是保存運行時的數據,主要就是存儲創建的對象;但是在不同版本的JDK有些許的變化,在JDK8以後堆中還存儲了靜態變量和字符串常量池 2.堆的內存細分 新生代 Eden Survivo

原创 GC算法【JVM】

JVM-GC算法 1.什麼對象是垃圾? 當一個對象沒有任何引用指向他的時候他就是一個垃圾 2.GC的作用 GC的作用實際上很簡單就是回收沒有用的對象,實際上對象回收後會存在內存碎片化,這樣不連續的空間沒辦法法分配大對象,所以

原创 Java字符串拼接原理

JVM-字符串拼接原理 前置內容 java虛擬機棧 1.那些字符串會進入字符串常量池 直接寫的字面量 字面量的拼接結果(注意:如果字符串拼接中有變量則結果不會進入字符串常量池) 調用String的intern方法可以將

原创 Java中爲什麼字符串拼接效率低

JVM-爲什麼字符串拼接效率低 前置內容 java虛擬機棧 字符串拼接原理 1. 源碼準備 首先編寫兩個方法一個使用字符串拼接,一個使用StringBuilder進行拼接; public class hello {

原创 方法區【JVM】

JVM-方法區 1. 方法區的作用 當類加載器加載完成類之後,會將類信息、運行時常量池、靜態變量(此處指的是指針,如果是一個對象對象的分配還是在堆中)等存儲在方法區;但在JDK不同版本對字符串常量和靜態變量的存儲有所不同,這部分

原创 static和static final的區別

JVM-static vs static final 如果不清楚JVM類加載過程請先看另一篇文章類加載系統 開發時我們經常用到static以及static final來修飾我們的字段變量,那麼他們到底有什麼區別呢?其實他們的區別

原创 類加載器【JVM】

JVM-類加載器 1. 類加載系統 作用:類加載系統的主要作用就是將編譯生成的字節碼文件加載到內存,當然此處的字節碼文件可以存在磁盤或網絡等其它地方。 主要過程: 加載 鏈接 初始化 1.1 加載過程 加載過程主要把磁

原创 Docker私服搭建

在開發中我們如果需要交付容器我們有哪些方式?實際上我們可以直接把文件打成壓縮包的形式,也可以通過私服進行傳遞 1.壓縮文件形式 docker commit 容器id 鏡像名:tag image to zip docke

原创 Docker部署MySQL不能正常連接

1.部署mysql docker鏡像拉取 docker pull mysql 創建容器 mkdir /root/mysql cd /root/mysql docker run -id \ -p 3307:3306 \

原创 Redis 基本數據結構

1. String 底層實現數據結構類似java的ArrayList 擴容: 小於1M是每次兩倍, 大於1M每次擴容1M 最大容量: 512M Redis 的字符串是動態字符串,是可以修改的字符串,內部結構實現上類似於 Java

原创 Redis 實現分佈式阻塞鎖

1. Redis分佈式鎖實現原理 分佈式鎖本質上要實現的目標就是在 Redis 裏面佔一個“茅坑”,當別的進程也要來佔時,發現已經有人蹲在那裏了,就只好放棄或者稍後再試。佔坑一般是使用 setnx(set if not exis

原创 Redis延時隊列實現

1. zset數據結構 利用zset數據結構的分值,可以利用時間戳的方式來實現一個分佈式延時隊列的實現; 通過zadd向zset中添加數據,然後啓動一個線程去執行zrangeByScore方法獲取數據即可 2. 具體實現 pu

原创 Redis分佈式阻塞隊列

1. 數據結構List Redis List的主要操作爲lpush/lpop/rpush/rpop四種,分別代表從頭部和尾部的push/pop,除此之外List還提供了兩種pop操作的阻塞版本blpop/brpop,用於阻塞獲取

原创 【多線程】隊列模式

1. 實現自定義阻塞隊列 阻塞隊列在get元素時如果隊列爲空那麼直接阻塞當前線程,在添加元素時notifyAll所有線程 public class RequestQueue { private final Linke