使用線程執(zhí)行 demux_thread 任務(wù)時(shí),主線程要等待它返回(可用 SDL_WaitThread()
),否則 main() 函數(shù)返回時(shí)將強(qiáng)制結(jié)束其他線程。
正好碰到了這個(gè)問題,我也試了很多方法,最后轉(zhuǎn)變了思路,你看能不能用上。
如果你是為了對(duì)外(不是nginx和tomcat間)的安全,那么nginx已經(jīng)替你認(rèn)證過了,tomcat就不用了。
你取證書是為了取用戶名的話,可以在nginx里直接取到$ssl_client_s_dn ,返回建立的SSL連接中客戶端證書的DN主題字段,里面是包含用戶名的,你直接把這個(gè)存到header里,在后面的應(yīng)用服務(wù)器直接取Header就行了。
virt 7070m
你的java程序能訪問的內(nèi)存空間地址, 包括代碼,數(shù)據(jù),共享庫,交換頁等等, 這是一個(gè)虛擬映射, 并不是所有地址都有相應(yīng)的物理內(nèi)存對(duì)應(yīng), 所以可以是大于物理內(nèi)存的.res 2.5g
這個(gè)可能和你的java啟動(dòng)參數(shù)有關(guān), 如 -Xmx2500m或比這個(gè)還大, 是程序占用的非交換的駐留內(nèi)存.shr 10m
占用內(nèi)存的可共享部分,可能與其他進(jìn)行共用.%mem 4.0
占用內(nèi)存的百分比
推測 2.5g/4%=62.5~你的機(jī)器有64G的物理內(nèi)存
至于代碼
List list = new ArrayList<String>(1000);
list.add("abcd");
可以這樣理解內(nèi)存使用new ArrayList<String>(1000);
僅僅是分配并初始化了一個(gè)ArrayList對(duì)象. 并初始化的內(nèi)部的數(shù)組對(duì)象
我們看一下JDK6的源碼
127 public ArrayList(int initialCapacity) {
128 super(); //調(diào)用AbstractList的默認(rèn)構(gòu)造函數(shù),里面什么也沒有做
129 if (initialCapacity < 0)
130 throw new IllegalArgumentException("Illegal Capacity: "+
131 initialCapacity);
132 this.elementData = new Object[initialCapacity]; //創(chuàng)建一個(gè)數(shù)組對(duì)象
133 }
真正消耗內(nèi)存的是 new Object[initialCapacity], 大約是initialCapacity*4個(gè)字節(jié), 算下來也不多.
list.add("abcd")增加了一個(gè)string對(duì)象加對(duì)象內(nèi)部字符和屬性(長度等)占用的內(nèi)存.
可以用下面的小程序完成對(duì)內(nèi)存使用的檢驗(yàn)
import java.util.*;
public class test{
public static void print(){
long total = Runtime.getRuntime().totalMemory();
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("total="+total+" used="+used);
}
public static void main(String[] args)throws Exception {
print(); //(1)
List<String> list = new ArrayList<>(1000000);
print(); //(2)
Thread.sleep(1000);
int i=0;
while(i++<1000000){
list.add(i+"test1234567890");
}
print();//(3)
Thread.sleep(10000);
}
}
代碼里的Thread.sleep的作用是為了占用內(nèi)存時(shí)間長一下,這樣可以用終端指令進(jìn)行監(jiān)控
top -p `pgrep java`
上面的程序執(zhí)行后輸出的結(jié)果為
total=55574528 used=608336 (1)
total=55574528 used=4608352 (2)
total=204472320 used=85200512 (3)
上面(2)-(1) 4608352-608336= 4000016
對(duì)應(yīng)的是ArrayList對(duì)象占16字節(jié), elementData數(shù)組每個(gè)占4字節(jié),共1Mx4=4M內(nèi)存.
放入字符串后, 85200512-4608352=80592160, 大概我的每個(gè)測試字符串占用了80字節(jié),實(shí)際字符平均20個(gè), 每個(gè)字符占用的也是4個(gè)字節(jié).
-----實(shí)踐出真知-----
if ($host = "www.xxx.com")
完全沒必要判斷$host,這個(gè)應(yīng)該在server_name
匹配
index index.html;
index
指令不能放到if
里面,應(yīng)該在server
或者location
塊就配置好全局的index
if ($url = '/mobile') {
root /var/www/mobile/dist;
}
if ($url = '/ipad') {
root /var/www/pad/dist;
}
root
可以放在location
里的if
但你這里完全沒必要用if
,使用location
和alias
即可
location /mobile/ {
alias /var/www/mobile/dist/;
}
location /ipad/ {
alias /var/www/pad/dist/;
}
似乎每一條配置指令都用錯(cuò)了……
抓包工具:fiddler,charles;
1.如果是https請求,需要設(shè)置代理,在手機(jī)上安裝相關(guān)軟件的證書,以中間人攻擊的方式,能夠看到http傳輸?shù)臄?shù)據(jù);
2.抓包開始,請清除緩存,不少app為了節(jié)約加載時(shí)間,一些數(shù)據(jù)會(huì)緩存。
3.盡量避免其他軟件在抓包時(shí)的干擾,后臺(tái)清理掉,或者在抓包軟件中設(shè)置只針對(duì)某一個(gè)域名抓??;
git add -> git commit -> git pull -> git push
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
改成@Consumes("application/json")
你把 sport 22
改為 dport 22
#!/bin/bash
ssh root@192.2.1.160 <<'ENDSSH'
cd /home/app/scripts/
sh -x arr.sh 'test'
ENDSSH
#!/bin/bash
ssh root@MachineB <<'ENDSSH'
cd xxx
sh -x local_script.sh -ub
ENDSSH
由服務(wù)器與瀏覽器的時(shí)間差引起.
假設(shè)服務(wù)器在 A 時(shí)間返回內(nèi)容, 那么返回的 HTTP 頭類似這樣:
Date: A
Cache-Control: max-age=60
可知 css 的有效時(shí)間窗口是 A ~ A+60, 瀏覽器接到時(shí)(忽略網(wǎng)絡(luò)傳輸?shù)绕渌臅r(shí))為 A + 100 時(shí)間, 它通過計(jì)算 <Date> + <max-age> 得知 css 內(nèi)容已經(jīng)過期, 因?yàn)?A + 100 > A + 60, 因此會(huì)重新驗(yàn)證內(nèi)容(If-Modified-Since, If-None-Match).
下面是個(gè)模擬的 HTTP 服務(wù)器, 你可以自由修改返回頭去測試瀏覽器反應(yīng)
// 運(yùn)行模擬服務(wù)器:
// 1. 保存成文件 "demo-server.go"
// 2. 下載 golang, https://golang.org/dl/
// 3. 打開命令行, 運(yùn)行 "go run demo-server.go"
// 4. 打開瀏覽器, 訪問 http://localhost:8080/
package main
import (
"fmt"
"log"
"net/http"
"time"
)
func setHeader(w http.ResponseWriter, h map[string]string) {
for key, value := range h {
w.Header()[key] = []string{value}
}
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, `
<html>
<head>
<link href='/cache.css' rel='stylesheet' type='text/css' />
</head>
<body>
<h2>default page</h2>
</body>
</html>
`)
})
http.HandleFunc("/cache.css", func(w http.ResponseWriter, r *http.Request) {
setHeader(w, map[string]string{
"Cache-Control": "public, max-age=130",
"ETag": "e123456789",
"Content-Type": "text/css",
// 服務(wù)器時(shí)間慢 100 秒
"Date": time.Now().Add(time.Second * -100).UTC().Format(http.TimeFormat),
})
fmt.Fprintf(w, "h2 {color: red}")
})
log.Fatal(http.ListenAndServe("127.0.0.1:8080", nil))
}
不知道你了解 C 里面的內(nèi)存對(duì)齊不?這里是同樣的道理
因?yàn)槟愕慕Y(jié)構(gòu)了出現(xiàn)了 float64,導(dǎo)致整個(gè)結(jié)構(gòu)里的成員都要以 64 位對(duì)齊(也就是 8 字節(jié))
對(duì)于 A,X Y 和 Z 各占 8 字節(jié),也就是 24 字節(jié)
對(duì)于 B,Y 占 8 字節(jié),而 X 和 Z 能在一個(gè) 8 字節(jié)的空間中放下,所以它們共用 8 字節(jié)
結(jié)論就顯而易見了吧
你可以使用 這個(gè)網(wǎng)站 來查看一個(gè)結(jié)構(gòu)體內(nèi)存布局
vhost 配置了嗎
grep
需要添加參數(shù) --line-buffered
,才能過濾 continuous stream.docker logs
使用 grep
某些環(huán)境下需要添加 2>&1
才有效果, docker logs xx -f 2>&1| grep --line-buffered xxx
參考
How to 'grep' a continuous stream?
docker logs <container id> | grep <some value> doesn't work
你的情況用acl來分配權(quán)限比較好
并沒有,需要自己寫擴(kuò)展。
function certainFunction(obj, keys) {
return keys.reduce((result, key) => {
if (obj.hasOwnProperty(key)) {
result[key] = obj[key];
}
return result;
}, {});
}
var obj = { a: 1, b: 2, c: 3, d: 4 };
certainFunction(obj, ['a', 'b']);
解決了,因?yàn)間ithub登錄成功后是 http 方式跳轉(zhuǎn)過去的,所以 express-session 需要設(shè)置下 secure: false
app.use(session({
secret: 'Stefanie Sun',
store: sessionStore,
resave: true, // 強(qiáng)制更新 session
saveUninitialized: true, //
cookie: {
maxAge: 3 * 3600 * 1000, // 過期時(shí)
secure: false // http 訪問時(shí) secure 為 false
},
rolling: true
}))
怪我沒有仔細(xì)看文檔=。=
docker run -it 鏡像:版本 /bin/bash
生成容器后可以進(jìn)去看有哪些軟件。
Dockerfile看不到的。
重現(xiàn)了Connection reset by peer
,代碼如下
//client
public static void main(String[] args) {
try {
Socket s = new Socket();
s.setSoLinger(true,0);//設(shè)置調(diào)用close就發(fā)送RST
s.connect(new InetSocketAddress("127.0.0.1",3113));
OutputStream os = s.getOutputStream();
os.write("hello".getBytes());
s.close();
System.in.read();//防止程序退出
}catch (Exception e){
e.printStackTrace();
}
}
//server
try {
ServerSocket ss = new ServerSocket(3113);
Socket s = ss.accept();
InputStream is = s.getInputStream();
byte[] buf =new byte[1024];
//int len = is.read(buf);
//System.out.println("recv:"+new String(buf,0,len));
Thread.sleep(10000);
s.getOutputStream().write("hello".getBytes());
System.out.println("send over");
System.in.read();
}catch (Exception e){
e.printStackTrace();
}
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。