GOPATH GOROOT 都是干嘛用的?
創(chuàng)新互聯(lián)是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷、企業(yè)網(wǎng)站建設(shè),賣鏈接,廣告投放平臺(tái)為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計(jì)到用戶體驗(yàn)提高,創(chuàng)新互聯(lián)力求做到盡善盡美。
配置環(huán)境跟java對(duì)比有點(diǎn)奇怪
https://blog.csdn.net/weixin_/article/details/
建立一個(gè)協(xié)程很簡單 加一個(gè)go關(guān)鍵字就可以
package concurrence
import (
"fmt"
"time"
)
func hello(i int) {
println("hello goroutine : " + fmt.Sprint(i))
}
func HelloGoRoutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
先提供一個(gè)或多個(gè)高性能隊(duì)列,線程/進(jìn)程/微服務(wù)之間需要訪問別人時(shí),不能直接讀寫別人的數(shù)據(jù),而要通過隊(duì)列提出請(qǐng)求,然后在對(duì)方處理請(qǐng)求時(shí)再做相應(yīng)處理。
Q:我對(duì)java比較熟悉,java里面通過鎖來實(shí)現(xiàn)共享內(nèi)存,從而實(shí)現(xiàn)通信。 那啥叫”通過通信共享內(nèi)存“?。?/p>
A:ultimate go notebook 里面講把channel當(dāng)做信號(hào)收發(fā),而不是一種數(shù)據(jù)結(jié)構(gòu)。
Q:我可以理解成chenel在go里 就像 阻塞隊(duì)列BlockingQueu在java里嗎? 只不過chenel顆粒度更小實(shí)現(xiàn)的更加底層?
A:無人回復(fù)。。。。
https://juejin.cn/post//#heading-14
https://draveness.me/whys-the-design-communication-shared-memory/
make(chan元素類型,[緩沖大小])·
例子:一個(gè)經(jīng)典的生產(chǎn)消費(fèi)模型
package concurrence
func CalSquare() {
src := make(chan int)
dest := make(chan int, 3)
go func() {
defer close(src)
for i := 0; i < 10; i++ {
src <- i
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
for i := range dest {
//復(fù)雜操作
println(i)
}
}
package concurrence
import (
"sync"
"time"
)
var (
x int64
lock sync.Mutex
)
func addWithLock() {
for i := 0; i < 2000; i++ {
lock.Lock()
x += 1
lock.Unlock()
}
}
func addWithoutLock() {
for i := 0; i < 2000; i++ {
x += 1
}
}
func Add() {
x = 0
for i := 0; i < 5; i++ {
go addWithoutLock()
}
time.Sleep(time.Second)
println("WithoutLock:", x)
x = 0
for i := 0; i < 5; i++ {
go addWithLock()
}
time.Sleep(time.Second)
println("WithLock:", x)
}
func ManyGoWait() {
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
go func(j int) {
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
Mutator:業(yè)務(wù)線程,分配新對(duì)象,修改對(duì)象指向關(guān)系
Collector: GC線程,找到存活對(duì)象,回收死亡對(duì)象的內(nèi)存空間. Serial GC:只有一個(gè)collector
Parallel GC;:支持多個(gè)collectors同時(shí)回收的 GC算法.
Concurrent GC: mutator(s)和collector(s)可以同時(shí)執(zhí)行
? Collectors必須感知對(duì)象指向關(guān)系的改變!
對(duì)象被回收的條件:指針指向關(guān)系不可達(dá)的對(duì)象
標(biāo)記根對(duì)象
靜態(tài)變量、全局變量、常量、線程棧等
標(biāo)記:找到可達(dá)對(duì)象
求指針指向關(guān)系的傳遞閉包:從根對(duì)象出發(fā),找到所有可達(dá)對(duì)象
清理:所有不可達(dá)對(duì)象
將存活對(duì)象復(fù)制到另外的內(nèi)存空間(Copying GC)
將死亡對(duì)象的內(nèi)存標(biāo)記為句分配“(Mark-sweep GC)
移動(dòng)并整理存活對(duì)象(Mark-compact GC)
根據(jù)對(duì)象的生命周期,使用不同的標(biāo)記和清理策略
目標(biāo):為對(duì)象在heap 上分配內(nèi)存·提前將內(nèi)存分塊
調(diào)用系統(tǒng)調(diào)用mmap()向OS申請(qǐng)一大塊內(nèi)存,例如4 MB·先將內(nèi)存劃分成大塊,例如8KB,稱作mspan
再將大塊繼續(xù)劃分成特定大小的小塊,用于對(duì)象分配
noscan nspan:分配不包含指針的對(duì)象——GC不需要掃描
scan mspan:分配包含指針的對(duì)象—— GC需要掃描
對(duì)象分配:根據(jù)對(duì)象的大小,選擇最合適的塊返回
GAB對(duì)于Go內(nèi)存管理來說是一個(gè)對(duì)象
本質(zhì):將多個(gè)小對(duì)象的分配合并成一次達(dá)對(duì)象的分配
問題:GAB的對(duì)象分配方式會(huì)導(dǎo)致內(nèi)存被延遲釋放
方案:移動(dòng) GAB中存活的對(duì)象
當(dāng)GAB總大小超過一定閾值時(shí),將GAB中存活的對(duì)象復(fù)制到另外分配的GAB中
原先的 GAB可以釋放,避免內(nèi)存泄漏
本質(zhì):用copying GC的算法管理小對(duì)象