測(cè)試面試題總結(jié)

1.自我介紹和介紹

這一般是面試的第一個(gè)問(wèn)題,記住每個(gè)人的簡(jiǎn)歷都不一樣,但是jd只有一份。所以要研究這個(gè)崗位的jd,再來(lái)定制自我介紹,去掉無(wú)關(guān)的,強(qiáng)調(diào)相關(guān)的,著重突出能給你加分的。所以一般都有這個(gè)套路:

  1. 先介紹自己的學(xué)校和公司,現(xiàn)在一般看本科和上一家公司,如果都不好,可能簡(jiǎn)歷關(guān)都過(guò)不了。
    a. 如果你學(xué)校讓你驕傲的話,先介紹下你的學(xué)校和專(zhuān)業(yè)
    b. 如果學(xué)校不行的話,直接介紹你工作過(guò)的公司,挑有名和相關(guān)的說(shuō)
  2. 簡(jiǎn)單說(shuō)說(shuō)你在公司負(fù)責(zé)的項(xiàng)目和你的職責(zé),不用細(xì)說(shuō),因?yàn)楹竺婷嬖嚳隙〞?huì)詳細(xì)問(wèn)。
  3. 說(shuō)下對(duì)這個(gè)職位的了解和興趣
    注意一定要簡(jiǎn)單,到位,達(dá)意,一切都是為了這個(gè)崗位做的自我介紹。

2、介紹下你負(fù)責(zé)的公司項(xiàng)目

  1. 首先你要給人家介紹清楚,你這個(gè)項(xiàng)目的產(chǎn)品是什么?話不要多,比如我們的產(chǎn)品是直播應(yīng)用,市場(chǎng)上競(jìng)品是什么,這里說(shuō)個(gè)top 1的,然后說(shuō)下特色是什么,如果知道用戶數(shù)據(jù)也可以說(shuō)下。
  2. 接著,講下項(xiàng)目產(chǎn)品有幾個(gè)端,服務(wù)端,客戶端,安卓,ios。簡(jiǎn)單說(shuō)下,如果面試者還有興趣,你可以把技術(shù)架構(gòu)說(shuō)一下,這個(gè)挺難的。得好好看看自己產(chǎn)品。
  3. 一般到這里,面試官會(huì)問(wèn),你在項(xiàng)目中干嘛了。那你就要說(shuō)你在項(xiàng)目中承擔(dān)的角色,是測(cè)試總控,還是某個(gè)模塊負(fù)責(zé)人。如果是總控就要說(shuō)說(shuō)你的測(cè)試計(jì)劃和測(cè)試策略,如果負(fù)責(zé)測(cè)試模塊的,就要說(shuō)說(shuō)是哪些模塊。這些模塊的作用是什么?4. 最后,說(shuō)說(shuō)你取得的成績(jī)。

3、如果項(xiàng)目周期很短,測(cè)試人力匱乏,你是怎么協(xié)調(diào)的?

  1. 測(cè)試有壓力,開(kāi)發(fā)必然有壓力,和開(kāi)發(fā)一起砍需求
  2. 系分和測(cè)分增加投入,做更精準(zhǔn)的測(cè)試
  3. 測(cè)試提前進(jìn)入
  4. 加強(qiáng)開(kāi)發(fā)自測(cè),拉取開(kāi)發(fā)交付用例
  5. 加班

4、描述下你團(tuán)隊(duì)的測(cè)試分工

  1. 業(yè)務(wù)壓力大的時(shí)候,業(yè)務(wù)為主,技術(shù)為輔
  2. 業(yè)務(wù)少的時(shí)候,技術(shù)為主,業(yè)務(wù)也不丟
  3. 老人帶新人,新人幫老人,選出業(yè)務(wù)領(lǐng)頭人和技術(shù)領(lǐng)頭人,形成團(tuán)隊(duì)梯隊(duì)
5、使用什么測(cè)試框架做的上一個(gè)項(xiàng)目的自動(dòng)化測(cè)試

testng

6、自己最熟悉哪個(gè)庫(kù),如何使用這些庫(kù)的,是否做了基于復(fù)用的封裝,怎么考慮的這些封裝

分別封裝了基礎(chǔ)類(lèi)例如:等待某元素出現(xiàn)的方法,更方便查找操作元素的方法,和被測(cè)試業(yè)務(wù)相關(guān)的類(lèi)和方法

7.如何使用xpath定位一個(gè)兄弟元素,就是和該元素同屬于一個(gè)父親節(jié)點(diǎn)的元素

答: 先找到父親元素,再找到自己的兄弟元素

8、自動(dòng)化遇到用例fail掉如何排查故障

答:手工查應(yīng)用是否真的有bug, 確認(rèn)不是bug,是不是新版本引入了新的變更,調(diào)試腳本看看自己的腳本是不是因?yàn)闆](méi)有等待元素出現(xiàn)后就操作了,是不是元素上面有其他元素出現(xiàn)這樣操作是不是操作了其他的元素上了

9、等待元素出現(xiàn)的這個(gè)方法如何實(shí)現(xiàn)的

等待方式有三種:
1)顯示等待:顯示等待,就是明確的要等到某個(gè)元素的出現(xiàn),等不到就一直等,除非在規(guī)定的時(shí)間之內(nèi)都沒(méi)找到,那么就跳出Exception,代碼,element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement"))
2)隱式等待:就是在創(chuàng)建driver時(shí),為瀏覽器對(duì)象創(chuàng)建一個(gè)等待時(shí)間,這個(gè)方法是得不到某個(gè)元素就等待一段時(shí)間,直到拿到某個(gè)元素位置3)線程暫停:Thread.sleep();這種等待屬于死等,很容易讓線程掛掉,使程序拋異常

用一個(gè)循環(huán)間隔時(shí)間去檢查這個(gè)元素是否可見(jiàn)
自己封裝的軟等待類(lèi)軟waitElementIsEnabledBy
使用 WebDriverWait.until,20秒等待到了元素直接執(zhí)行,沒(méi)有就循環(huán)等待,20秒等待不到就拋出異常

public static Boolean waitElementIsEnabledBy(By by) {
        try {
            WebDriver waitDriver = driver;
            long waitTime = 20;
            waitDriver.manage().timeouts().implicitlyWait(waitTime, TimeUnit.SECONDS);
            (new WebDriverWait(waitDriver, waitTime)).until(ExpectedConditions.elementToBeClickable(by));
            return true;
        } catch (Exception e) {
            return false;
        }
    }

10、在selenium自動(dòng)化測(cè)試中,你一般完成什么類(lèi)型的測(cè)試?

用于回歸測(cè)試。每次迭代都會(huì)執(zhí)行一次回歸

11、你什么時(shí)候不自動(dòng)化測(cè)試?

① 人們不應(yīng)該在以下情況下自動(dòng)化
② 當(dāng)受測(cè)試的應(yīng)用程序頻繁更改時(shí)
③ 一次測(cè)試案例
④ 臨時(shí) - 隨機(jī)測(cè)試

12、你如何從Selenium連接到數(shù)據(jù)庫(kù)?

Selenium是一個(gè)Web UI自動(dòng)化工具。它不提供任何API來(lái)建立數(shù)據(jù)庫(kù)連接。
我們需要jdbcjar包,然后使用Connection對(duì)象來(lái)連接數(shù)據(jù)庫(kù)并執(zhí)行sql

13、XPath中使用單斜杠和雙斜杠有什么區(qū)別?

1)如果XPath是從文檔節(jié)點(diǎn)開(kāi)始,它將允許創(chuàng)建“絕對(duì)”路徑表達(dá)式。
例如 “/ html / body / p”匹配所有的段落元素。
2)如果XPath在文檔中的任意位置開(kāi)始進(jìn)行選擇匹配,那么它將允許創(chuàng)建“相對(duì)”路徑表達(dá)式。
例如 “// p”匹配所有的段落元素。

Selenium中可以用哪些驗(yàn)證點(diǎn)?

Selenium最主要有三種驗(yàn)證點(diǎn) -
檢查頁(yè)面標(biāo)題
檢查某些文字
檢查某些元素(文本框,下拉菜單,表、 元素是否出現(xiàn) 、是否可點(diǎn)擊 、是否消失等)

14、在selenium中處理多個(gè)彈出窗口的機(jī)制是什么?

可以使用命令getWindowHandles()來(lái)處理多個(gè)彈出窗口。
然后將所有窗口名稱存儲(chǔ)到Set變量中并將其轉(zhuǎn)換為數(shù)組。
接下來(lái),通過(guò)使用數(shù)組索引,導(dǎo)航到特定的窗口。
driver.switchTo().window(ArrayIndex);

15、你如何處理使用Selenium的Ajax控件?

處理這樣的控件,需要在文本框中輸入值之后,捕獲字符串中的所有建議值;然后,分割字符串,取值就好了。

16、你將如何處理Selenium WebDriver中的警報(bào)/彈出窗口?

有兩種類(lèi)型的警報(bào)通常被引用。
基于Windows的警報(bào)彈出窗口
基于Web的警報(bào)彈出窗口

  • 基于Web的警報(bào)彈出窗口。
    WebDriver為用戶提供了一種使用Alert界面處理這些彈出窗口的非常有效的方法。
    1)void dismiss() - 一旦出現(xiàn)彈出窗口,dismiss()方法就會(huì)點(diǎn)擊“Cancel”按鈕。
    2)void accept() - 只要彈出窗口出現(xiàn),accept()方法就會(huì)點(diǎn)擊“Ok”按鈕。
    3)String getText() - getText()方法返回警告框中顯示的文本。
    4)void sendKeys(String stringToSend) - sendKeys()方法將指定的字符串模式輸入到警告框中。
  • 基于Windows的警報(bào)彈出窗口。
    處理基于windows的彈出窗口總是有點(diǎn)棘手,因?yàn)槲覀冎繱elenium是一個(gè)自動(dòng)化測(cè)試工具,它只支持Web應(yīng)用程序測(cè)試,也就是說(shuō),它不支持基于Windows的應(yīng)用程序,窗口警報(bào)就是其中之一。
    Robot class是基于Java的實(shí)用程序,它模擬鍵盤(pán)和鼠標(biāo)操作,并可以有效地用于處理基于windows的彈出與鍵盤(pán)事件的幫助。
    KeyPress和KkeyRelease方法可以分別模擬用戶按下和釋放鍵盤(pán)上某個(gè)鍵的操作。

17、Selenium WebDriver中的可用定位器是什么?

1)ID,
2)Name,名稱
3)CSS,
4)XPath,
5)Class name,
6)TagName,
7)LinkText, 鏈接文本
8)Partial Link Text.部分鏈接文本

18、解釋使用TestNG而不是JUnit框架的好處?

TestNG相較于Junit的優(yōu)勢(shì):
1)在JUnit中,我們必須聲明@BeforeClass和@AfterClass,這是JUnit中的一個(gè)約束,而在TestNG中沒(méi)有像這樣的約束。
2)TestNG提供了更多的setUp / tearDown級(jí)別。1.@ Before/AfterSuite 2.@Before/AfterTest 3.@Before/AfterGroup
3)TestNG中不需要擴(kuò)展任何類(lèi)。
4)TestNG中沒(méi)有方法名稱約束,就像JUnit一樣。
5)在TestNG中,我們可以告訴測(cè)試一個(gè)方法依賴于另一個(gè)方法,而在JUnit中這是不可能的。
6)測(cè)試用例的分組在TestNG中可用,而JUnit中則不可用。執(zhí)行可以基于組完成。例如,如果你已經(jīng)定義了許多案例,并通過(guò)將2個(gè)組分別定義為“離職“與”回歸”隔離。如果你只是想執(zhí)行“理智”的情況,那就告訴TestNG執(zhí)行“理智”。TestNG將自動(dòng)執(zhí)行屬于“離職”組的案例。
7)另外,TestNG支持并行測(cè)試用例執(zhí)行。

19、可以使用TestNG運(yùn)行一組測(cè)試用例嗎?

是的,TestNG框架支持在測(cè)試組的幫助下執(zhí)行多個(gè)測(cè)試用例。
它提供了以下選項(xiàng)來(lái)運(yùn)行特定組中的測(cè)試用例。
如果想基于回歸測(cè)試或冒煙測(cè)試等其中一個(gè)組來(lái)執(zhí)行測(cè)試用例,那么:
@Test(groups = {“regression-tests”, “smoke-tests”})

20、常見(jiàn)控件使用


1) link/button:
element.click()
注:ajax不能使用clickAndWait()函數(shù),因?yàn)閏ickAndWait函數(shù)會(huì)在click之后等待頁(yè)面重新加載完成,而ajax是部分刷新,所以這個(gè)頁(yè)面不能重新加載完成。
2) Textbox:
element.send_keys(‘test’)
3) Upload
Driver.find_element_by_id(‘id’).send_keys(‘D\test.txt’)
4) Mouse Event:
e1=driver.find_element_by_id(‘kw’)
ActionChains(driver).double_click()/.context_click()/.drag_and_drop()/.move_to_element()/.perform()  
 # 雙擊/右擊/拖動(dòng)/懸停/執(zhí)行actionChains中的行為
5) Dropdown:
·<Select>標(biāo)簽的下拉菜單
from selenium.webdriver.support.ui import Select
Select(driver.find_element_by_id(‘gender’)).select_by_index(1)
Select(driver.find_element_by_id(‘gender’)).select_by_value(“2”)
Select(driver.find_element_by_id(‘gender’)).select_by_visible_text(“Male”)
·非<Select>標(biāo)簽的下拉菜單
Dropdown1 = driver.find_element_by_id(‘id’) #先定位到dropdown
Dropdown1.find_element_by_id(“l(fā)i2_input_2”) #再定位到dropdown中的值
6) Alert:
driver.switch_to.alert.accept()//接受
driver.switch_to.alert.dismiss() //取消
Message=driver.switch_to.alert.text  //獲取彈窗的文本消息
driver.switch_to.alert.send_keys(‘hello’) //輸入值,這個(gè)在alert和confirm中不可用
7) Window
Driver.refresh() 刷新
Driver.back() 后退
Driver.forward() 前進(jìn)
Driver.maximize_window() 最大化
Driver.set_window_size(100,200) 設(shè)置窗口大小
Driver.switch_to.window(searchwindow)
8) Frame
Driver.switch_to.frame(ReferenceFrame)
Driver.switch_to.parent_frame()  # frame需要一級(jí)一級(jí)切
Driver.switch_to.default_content()

21、關(guān)于自動(dòng)化測(cè)試報(bào)告生成?

TestNG原生就可以生成測(cè)試報(bào)告,也有第三方叫reportNG的插件

22、怎么提高用例執(zhí)行速度

TestNG配置并行執(zhí)行
parallel="methods" thread-count="3"
parallel:指定并行執(zhí)行方式(是否多線程并發(fā)運(yùn)行測(cè)試;可選值(false | methods | tests | classes | instances),默認(rèn) "false")
thread-count:并行的值(并發(fā)執(zhí)行時(shí)的線程池?cái)?shù)量,默認(rèn)為"5)

23、web自動(dòng)化測(cè)試報(bào)告怎么輸出的
用TestNG生成報(bào)告,由于Testng生成的測(cè)試報(bào)告不夠直觀,可以使用reportng來(lái)生成
方法:
1)配置reportng依賴和監(jiān)聽(tīng)
2)在Window-->Preferences中設(shè)置
(1)禁用默認(rèn)監(jiān)聽(tīng)器
(2)設(shè)置監(jiān)聽(tīng)器:org.uncommons.reportng.HTMLReporter
3)xml文件配置使用的reportng方法

  <listeners>
                      //testng的XML配置文件中添加這些內(nèi)容
                     <listener class-name="org.uncommons.reportng.HTMLReporter" />
                     <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
            </listeners>

4)Html下的index.html 就是reportNg 生成的報(bào)告,另外TestNG-xslt也可以,但是沒(méi)有用過(guò)

  • TestNG xml參數(shù)文件詳解
testng.xml文件節(jié)點(diǎn)屬性說(shuō)明:

suite屬性說(shuō)明:
@name: suite的名稱,必須參數(shù)    
@junit:是否以Junit模式運(yùn)行,可選值(true | false),默認(rèn)"false"
@verbose:命令行信息打印等級(jí),不會(huì)影響測(cè)試報(bào)告輸出內(nèi)容;可選值(1|2|3|4|5) 
@parallel:是否多線程并發(fā)運(yùn)行測(cè)試;可選值(false | methods | tests | classes | instances),默認(rèn) "false"
@thread-count:當(dāng)為并發(fā)執(zhí)行時(shí)的線程池?cái)?shù)量,默認(rèn)為"5"
@configfailurepolicy:一旦Before/After Class/Methods這些方法失敗后,是繼續(xù)執(zhí)行測(cè)試還是跳過(guò)測(cè)試;可選值 (skip | continue),默認(rèn)"skip"
@annotations:獲取注解的位置,如果為"javadoc", 則使用javadoc注解,否則使用jdk注解
@time-out:為具體執(zhí)行單元設(shè)定一個(gè)超時(shí)時(shí)間,具體參照parallel的執(zhí)行單元設(shè)置;單位為毫秒
@skipfailedinvocationcounts:是否跳過(guò)失敗的調(diào)用,可選值(true | false),默認(rèn)"false"
@data-provider-thread-count:并發(fā)執(zhí)行時(shí)data-provider的線程池?cái)?shù)量,默認(rèn)為"10"
@object-factory:一個(gè)實(shí)現(xiàn)IObjectFactory接口的類(lèi),用來(lái)實(shí)例測(cè)試對(duì)象
@allow-return-values:是否允許返回函數(shù)值,可選值(true | false),默認(rèn)"false"
@preserve-order:順序執(zhí)行開(kāi)關(guān),可選值(true | false) "true"
@group-by-instances:是否按實(shí)例分組,可選值(true | false) "false"

test屬性說(shuō)明:
@name:test的名字,必選參數(shù);測(cè)試報(bào)告中會(huì)有體現(xiàn)
@junit:是否以Junit模式運(yùn)行,可選值(true | false),默認(rèn)"false"
@verbose:命令行信息打印等級(jí),不會(huì)影響測(cè)試報(bào)告輸出內(nèi)容;可選值(1|2|3|4|5) 
@parallel:是否多線程并發(fā)運(yùn)行測(cè)試;可選值(false | methods | tests | classes | instances),默認(rèn) "false"
@thread-count:當(dāng)為并發(fā)執(zhí)行時(shí)的線程池?cái)?shù)量,默認(rèn)為"5"
@annotations:獲取注解的位置,如果為"javadoc", 則使用javadoc注解,否則使用jdk5注解
@time-out:為具體執(zhí)行單元設(shè)定一個(gè)超時(shí)時(shí)間,具體參照parallel的執(zhí)行單元設(shè)置;單位為毫秒
@enabled:設(shè)置當(dāng)前test是否生效,可選值(true | false),默認(rèn)"true" 
@skipfailedinvocationcounts:是否跳過(guò)失敗的調(diào)用,可選值(true | false),默認(rèn)"false"
@preserve-order:順序執(zhí)行開(kāi)關(guān),可選值(true | false) "true"
@group-by-instances:是否按實(shí)例分組,可選值(true | false) "false"
@allow-return-values:是否允許返回函數(shù)值,可選值(true | false),默認(rèn)"false"

性能測(cè)試類(lèi)

1、 性能測(cè)試包含了哪些軟件測(cè)試(至少舉出3種)?

負(fù)載測(cè)試(Load Testing):負(fù)載測(cè)試是一種主要為了測(cè)試軟件系統(tǒng)是否達(dá)到需求文檔設(shè)計(jì)的目標(biāo),譬如軟件在一定時(shí)期內(nèi),最大支持多少并發(fā)用戶數(shù),軟件請(qǐng)求出錯(cuò)率等,測(cè)試的主要是軟件系統(tǒng)的性能。
壓力測(cè)試(Stress Testing):強(qiáng)度測(cè)試也就是壓力測(cè)試,壓力測(cè)試主要是為了測(cè)試硬件系統(tǒng)是否達(dá)到需求文檔設(shè)計(jì)的性能目標(biāo),譬如在一定時(shí)期內(nèi),系統(tǒng)的cpu利用率,內(nèi)存使用率,磁盤(pán)I/O吞吐率,網(wǎng)絡(luò)吞吐量等,壓力測(cè)試和負(fù)載測(cè)試最大的差別在于測(cè)試目的不同。
容量測(cè)試(Volume Testing):確定系統(tǒng)最大承受量,譬如系統(tǒng)最大用戶數(shù),最大存儲(chǔ)量,最多處理的數(shù)據(jù)流量等。
或者在下面選擇幾項(xiàng):
并發(fā)測(cè)試 - 測(cè)試多用戶并發(fā)訪問(wèn)同一個(gè)應(yīng)用、模塊、數(shù)據(jù)時(shí)是否產(chǎn)生隱藏的并發(fā)問(wèn)題
基準(zhǔn)測(cè)試 - 比較新的或未知測(cè)試對(duì)象與已知參照標(biāo)準(zhǔn)(如現(xiàn)有軟件或評(píng)測(cè)標(biāo)準(zhǔn))的性能。
爭(zhēng)用測(cè)試:- 核實(shí)測(cè)試對(duì)象對(duì)于多個(gè)主角對(duì)相同資源(數(shù)據(jù)記錄、內(nèi)存等)的請(qǐng)求的處理是否可以接受。
性能配置 - 核實(shí)在操作條件保持不變的情況下,測(cè)試對(duì)象在使用不同配置時(shí)其性能行為的可接受性。
負(fù)載測(cè)試- 核實(shí)在保持配置不變的情況下,測(cè)試對(duì)象在不同操作條件(如不同用戶數(shù)、事務(wù)數(shù)等)下性能行為的可接受性。
強(qiáng)度測(cè)試- 核實(shí)測(cè)試對(duì)象性能行為在異?;驑O端條件(如資源減少或用戶數(shù)過(guò)多)之下的可接受性。
容量測(cè)試- 核實(shí)測(cè)試用戶同時(shí)使用軟件程序的最大數(shù)量

2、請(qǐng)問(wèn)什么是性能測(cè)試、負(fù)載測(cè)試、壓力測(cè)試?

1)性能測(cè)試是通過(guò)自動(dòng)化的測(cè)試工具模擬多種正常、峰值以及異常負(fù)載條件來(lái)對(duì)系統(tǒng)的各項(xiàng)性能指標(biāo)進(jìn)行測(cè)試。
2)負(fù)載測(cè)試、壓力測(cè)試參考答案如上題

3、什么時(shí)候可以開(kāi)始執(zhí)行性能測(cè)試?

在產(chǎn)品相對(duì)比較穩(wěn)定,功能測(cè)試結(jié)束后。

3、簡(jiǎn)述性能測(cè)試的步驟。
熟悉應(yīng)用
了解應(yīng)用的架構(gòu)、功能邏輯
測(cè)試需求
1、需要將開(kāi)發(fā)給定的需求轉(zhuǎn)為吞吐量和響應(yīng)時(shí)間。
2、根據(jù)測(cè)試目的,細(xì)化需求
測(cè)試準(zhǔn)備
測(cè)試準(zhǔn)備包括測(cè)試客戶端機(jī)器準(zhǔn)備、測(cè)試數(shù)據(jù)準(zhǔn)備、測(cè)試腳本準(zhǔn)備。
測(cè)試執(zhí)行
測(cè)試的執(zhí)行中,需要監(jiān)控測(cè)試客戶端和服務(wù)器性能,監(jiān)控服務(wù)器端應(yīng)用情況:
客戶端的系統(tǒng)資源(cpu、io、memory)情況
服務(wù)端的系統(tǒng)資源(cpu、io、memory)情況
服務(wù)器的jvm運(yùn)行情況
服務(wù)端的應(yīng)用情況,看是否有異常
響應(yīng)時(shí)間、吞吐量等指標(biāo)
系統(tǒng)資源監(jiān)控,linux下可以采用的工具有:vmstat、top、meminfo等。
JVM的監(jiān)控,可以用jprofiler工具,linux下面的jmap、jhat等。
響應(yīng)時(shí)間、吞吐量等,由grinder提供。
上述這些信息,一般在測(cè)試結(jié)束后,均需要?dú)w檔整理,已備后續(xù)詳細(xì)分析
我們自己開(kāi)發(fā)一套腳本,用于以固定的頻率獲取測(cè)試客戶端和服務(wù)器的vmstat和top輸出、grinder的log,并從中截取有用信息保存,用于事后分析。
每次測(cè)試運(yùn)行完以后,肯定會(huì)增加很多數(shù)據(jù),需要考慮本次執(zhí)行對(duì)數(shù)據(jù)量的影響,如果數(shù)據(jù)量的變化對(duì)后續(xù)測(cè)試會(huì)有影響,則需要清理數(shù)據(jù)。
測(cè)試分析

4、lr和jmeter有什么區(qū)別

1).安裝:Jmeter安裝方便快捷,占據(jù)空間小,無(wú)需破解,無(wú)需費(fèi)用;
LR安裝繁瑣,耗時(shí)長(zhǎng),對(duì)環(huán)境要求嚴(yán)格,占據(jù)空間大,安裝包為1G多,需 要破解,正版價(jià)格昂貴, LR11僅支持IE8~9,LR12無(wú)法破解,支持IE11及以上;
2).IP欺騙功能:IP欺騙是指在一臺(tái)PC機(jī)上可以模擬多個(gè)IP地址分配給并發(fā)用戶,能夠更加真實(shí)的模擬實(shí)際的應(yīng)用環(huán)境;
Jmeter沒(méi)有IP欺騙功能,LR有IP欺騙功能
3).錄制腳本:Jmeter支持代理錄制腳本,但并不好用,需要裝IE代理,也可用badboy錄制; LR支持錄制腳本,方便使用;
4).壓力機(jī)資源情況:LR體積大,消耗的資源比Jmeter高,高并發(fā)情況下,LR可能出現(xiàn)壓力機(jī)資源瓶頸;
5).靜態(tài)資源下載:LR默認(rèn)下載靜態(tài)資源,若不下載靜載資源需要手動(dòng)配置;
Jmeter默認(rèn)不下載靜態(tài)資源,若二者均使用默認(rèn)設(shè)置,性能測(cè)試結(jié)果差異會(huì)較大;
6).協(xié)議:Jmeter只支持WEB、FTP和數(shù)據(jù)庫(kù)方面的性能測(cè)試;
LR支持協(xié)議多,能覆蓋絕大多數(shù)應(yīng)用,功能強(qiáng)大;
7).網(wǎng)速模擬:Jmeter不支持網(wǎng)速模擬,LR支持網(wǎng)速模擬;
8).擴(kuò)展性:Jmeter是開(kāi)源的,可根據(jù)需要更改源代碼,LR可附加函數(shù)庫(kù);
9).報(bào)告:Jmeter報(bào)表分析數(shù)據(jù)較少,LR報(bào)告監(jiān)控的性能指標(biāo)豐富,界面美觀;

5、Nginx和Tomcat是進(jìn)程模式還是線程模式

Nginx:多進(jìn)程. 一個(gè)主進(jìn)程管理多個(gè)worker子進(jìn)程
Tomcat:?jiǎn)芜M(jìn)程多線程

Tomcat的運(yùn)行模式有幾種?簡(jiǎn)單講一下模式之間的區(qū)別

Tomcat的運(yùn)行模式有3種, BIO、NIO和APR。我們公司用的NIO

BIO   
       一個(gè)線程處理一個(gè)請(qǐng)求。缺點(diǎn):并發(fā)量高時(shí),線程數(shù)較多,浪費(fèi)資源。Tomcat7或以下,在Linux系統(tǒng)中默認(rèn)使用這種方式。
NIO 
     利用Java的異步IO處理,可以通過(guò)少量的線程處理大量的請(qǐng)求。Tomcat8在Linux系統(tǒng)中默認(rèn)使用這種方式。
     Tomcat7必須server.xml里的Connector節(jié)點(diǎn)配置來(lái)啟動(dòng):
     <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/> 
APR
     即Apache Portable Runtime,從操作系統(tǒng)層面解決io阻塞問(wèn)題。Tomcat7或Tomcat8在Win7或以上的系統(tǒng)中啟動(dòng)默認(rèn)使用這種方式。

6、簡(jiǎn)單說(shuō)一下你們公司的系統(tǒng)架構(gòu)(明日補(bǔ)充)

1)靜態(tài)文件、css樣式、文件模板放在了cdn上
2)Nginx負(fù)載均衡
3)

image
7、Nginx怎么獲取請(qǐng)求的真實(shí)ip

location 中配置 proxy_set_header X-Forwarded-For 然后服務(wù)端代碼 request.getHeader就可以獲得真實(shí)ip

server {
    listen       80;
    server_name  www.wenki.info;    #要訪問(wèn)的域名

    charset utf8;

    location / {
        proxy_pass       http://server;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

8、全鏈路壓測(cè)做過(guò)嗎?怎么做的?

做過(guò),全鏈路我們?cè)谡江h(huán)境做的
1)首先要梳理核心鏈路的流程,明確鏈路的邊界,核心鏈路是一個(gè)業(yè)務(wù)的核心,這一塊應(yīng)該可以很快梳理清楚,但是,難點(diǎn)在于梳理清楚鏈路的邊界,分支業(yè)務(wù)
每個(gè)業(yè)務(wù)owner反復(fù)確認(rèn),哪些是核心業(yè)務(wù),哪些是分支業(yè)務(wù),哪些參與壓測(cè),哪些不參與壓測(cè),把這些形成文檔,逐個(gè)跟進(jìn)。
2)提供全鏈路壓測(cè)的底層支持
我的理解:
流量、數(shù)據(jù)隔離 ,可以在head中打標(biāo)
新建影子表,寫(xiě)入和讀取都走影子表
日志-影子目錄:將壓測(cè)流量產(chǎn)生的日志落入到影子目錄

全鏈路透?jìng)鲏簻y(cè)標(biāo)志:必須有一種在全鏈路透?jìng)鲏簻y(cè)標(biāo)志的能力,并且必須基于一次請(qǐng)求,也就是同一個(gè)traceId,現(xiàn)在,大部分分布式業(yè)務(wù)都會(huì)接入trace系統(tǒng),例如,google的dapper,阿里的鷹眼等,對(duì)trace系統(tǒng)進(jìn)行改造,使其能夠透?jìng)鲏簻y(cè)標(biāo)志,需要透?jìng)鞯穆窂酱蟾庞校?
    HTTP,RPC(DUBBO),MQ,線程池等

影子表:參與壓測(cè)的業(yè)務(wù),要逐個(gè)排查自己依賴的數(shù)據(jù)庫(kù),然后創(chuàng)建影子表,影子表必須跟正常表的schema保持一致,可以在每次壓測(cè)時(shí)候手動(dòng)創(chuàng)建,也可以推動(dòng)DBA自動(dòng)創(chuàng)建。創(chuàng)建好影子表后,如果當(dāng)前流量是壓測(cè)流量,那么寫(xiě)入和讀取都走影子表。如果有自己的數(shù)據(jù)庫(kù)中間件最好,沒(méi)有的話可以借助于Mybatis的Interceptor機(jī)制。
日志-影子目錄:為了防止壓測(cè)流程的日志對(duì)正常日志造成干擾,需要改造日志組件,將壓測(cè)流量產(chǎn)生的日志落入到影子目錄。影子目錄可以有日志組件自動(dòng)創(chuàng)建。
MQ支持是否消費(fèi)壓測(cè)流量:有的時(shí)候,全鏈路會(huì)通過(guò)MQ進(jìn)行傳遞,所以,必須在消費(fèi)MQ的時(shí)候進(jìn)行選擇:是否選擇消費(fèi)壓測(cè)流量的MQ消息。這就需要對(duì)MQ系統(tǒng)進(jìn)行改造,一方面使其可以透?jìng)鲏簻y(cè)流量,另一方面,需要支持配置是否消費(fèi)壓測(cè)的MQ消息
緩存,大數(shù)據(jù)隔離:還有一些場(chǎng)景,比如,緩存層,大數(shù)據(jù)層對(duì)壓測(cè)流量的處理也要考慮隔離。緩存可以使用不同的集群;大數(shù)據(jù)可以直接不收集壓測(cè)的數(shù)據(jù)

3)思考全鏈路壓測(cè)的數(shù)據(jù)怎么mock
在使用影子表之后,可以比較輕松的實(shí)現(xiàn)跟正常數(shù)據(jù)隔離,那剩下的就是好構(gòu)造好mock數(shù)據(jù),有幾點(diǎn)需要考慮:
① 用戶數(shù)據(jù)要提前做好認(rèn)證等準(zhǔn)備工作
② Mock數(shù)據(jù)要盡可能跟真實(shí)數(shù)據(jù)保持一致,比如,價(jià)格水平,圖片數(shù)量,地址信息等等
③ Mock數(shù)據(jù)有些限制需要放開(kāi),比如,庫(kù)存,一些運(yùn)營(yíng)性質(zhì)的活動(dòng)可以取消等
④ 千萬(wàn)不要污染正常數(shù)據(jù):認(rèn)真梳理數(shù)據(jù)處理的每一個(gè)環(huán)節(jié),確保mock數(shù)據(jù)的處理結(jié)果不會(huì)寫(xiě)入到正常庫(kù)里面
4)梳理監(jiān)控體系
① 核心接口和核心依賴的流量和耗時(shí)監(jiān)控
② 中間件組件,緩存,數(shù)據(jù)庫(kù)的監(jiān)控報(bào)警
③ 機(jī)器的指標(biāo)報(bào)警
5)線下做好預(yù)演
真實(shí)的壓測(cè)之前,肯定要進(jìn)行預(yù)演,預(yù)演主要確認(rèn):
① 壓測(cè)流程是否寫(xiě)入到了正確的目的地,例如,寫(xiě)入到影子表,影子目錄,壓測(cè)cache等等
② 壓測(cè)流量的降級(jí)是否完備和有效
③ 進(jìn)一步確保監(jiān)控都已到位

6)盡量模擬現(xiàn)實(shí),用戶的行為,例如
① 購(gòu)買(mǎi)的行為:不是下單后立即購(gòu)買(mǎi),而是要等一下子
② 騎車(chē)子的行為:開(kāi)鎖后并不是里面換車(chē),而是騎一會(huì)

7)逐步平滑加壓
壓測(cè)的時(shí)候,逐步加壓,并且要保持平滑加壓,不要把一秒的流量都在前面幾毫秒內(nèi)都?jí)撼鋈ァ?/p>

難點(diǎn): 推進(jìn)
全鏈路壓測(cè)的技術(shù)難點(diǎn)不多,除了要花時(shí)間梳理流程和思考如何處理數(shù)據(jù)之外,最難的就是整個(gè)鏈路跨多個(gè)業(yè)務(wù),甚至部門(mén),需要跟進(jìn)每個(gè)業(yè)務(wù)線的進(jìn)度,確保大家能夠在給定的時(shí)間點(diǎn)進(jìn)行聯(lián)調(diào)以及進(jìn)行壓測(cè)。在推進(jìn)的時(shí)候,按照核心鏈路所在的模塊進(jìn)行跟進(jìn),每個(gè)模塊出一個(gè)owner,各個(gè)owner跟進(jìn)核心的接口和依賴,每周大家碰一下同步下總體的進(jìn)度

什么情況下回出現(xiàn)Full GC,什么情況下會(huì)出現(xiàn)Young GC
  • 對(duì)象優(yōu)先在新生代Eden區(qū)中分配,如果Eden區(qū)沒(méi)有足夠的空間時(shí),就會(huì)觸發(fā)一次young gc
  • Full gc的觸發(fā)條件有多個(gè),F(xiàn)ULL GC的時(shí)候會(huì)STOP THE WORD。
    ① 在執(zhí)行Young gc之前,JVM會(huì)進(jìn)行空間分配擔(dān)?!绻夏甏倪B續(xù)空間小于新生代對(duì)象的總大?。ɑ驓v次晉升的平均大小),則觸發(fā)一次full gc。
    ② 顯式調(diào)用System.gc()方法時(shí);
    ③ 方法去空間不足
    ④ 大對(duì)象直接進(jìn)入老年代,從年輕代晉升上來(lái)的老對(duì)象,嘗試在老年代分配內(nèi)存時(shí),但是老年代內(nèi)存空間不夠;
9、你們公司的jvm垃圾回收用的那種方法

答: copying ( 一般存活區(qū)使用這個(gè)算法)
問(wèn):為什么用copying?
答:第一個(gè)好處:沒(méi)有內(nèi)存碎片的好處;第二:大小相等,位置互換,降低存活對(duì)象到老年區(qū)的評(píng)率,降低fullGC的頻率;
問(wèn):老年區(qū)你們用什么算法?
答:標(biāo)記-整理,Mark-Compact
問(wèn):原理說(shuō)一下,結(jié)合了標(biāo)記-清楚和copying兩個(gè)的特點(diǎn),優(yōu)點(diǎn)有兩個(gè),第一:可以使用全部的內(nèi)存,第二:對(duì)內(nèi)存做了壓縮、排序,減少了內(nèi)存碎片

10、jvm內(nèi)存分配比例是多少

整個(gè)堆大小=年輕代大小 + 年老代大小 + 持麗代大小。持麗代
一般固定大小為 64m,所以增大年輕代后,將會(huì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大,Sun官方推薦配置年輕代大小為整個(gè)堆癿 3/8?,F(xiàn)在一般都是年輕代3/1,老年代2/3,持久帶分別占用年輕代的1/10

11、如果現(xiàn)在讓你做10000并發(fā),你怎么做的?

1)熟悉應(yīng)用
了解了應(yīng)用架構(gòu),我們才能知道,我們需要模擬的是:一般的html靜態(tài)文件請(qǐng)求、一般的servlet和jsp請(qǐng)求、AJAX請(qǐng)求、還是遠(yuǎn)程調(diào)用請(qǐng)求等。
我們必須了解:應(yīng)用的功能邏輯
2)明確測(cè)試需求
一般我們得到的任務(wù)類(lèi)似:100萬(wàn)uv(每天使用應(yīng)用的人數(shù))
但是,我們了解的是吞吐量、響應(yīng)時(shí)間等指標(biāo),所以我們要根據(jù)自己的經(jīng)驗(yàn)轉(zhuǎn)換成一系列的指標(biāo)。
100萬(wàn)uv的活動(dòng)時(shí)間分布,然后根據(jù)28原則算出tps,當(dāng)然最后的結(jié)果還是要和整個(gè)team討論一下
3)測(cè)試準(zhǔn)備
客戶端機(jī)器準(zhǔn)備、測(cè)試數(shù)據(jù)準(zhǔn)備、測(cè)試腳本準(zhǔn)備、服務(wù)器端環(huán)境準(zhǔn)備
客戶端機(jī)器:執(zhí)行壓測(cè)腳本機(jī)器,首先客戶機(jī)資源要足夠,如果瓶頸在客戶機(jī),無(wú)法評(píng)估服務(wù)端
測(cè)試數(shù)據(jù):例如訂單商品掃描,那么首先我們需要造訂單數(shù)據(jù)和商品數(shù)據(jù)
測(cè)試腳本準(zhǔn)備:腳本準(zhǔn)備好,并先調(diào)試成功
服務(wù)端準(zhǔn)備:最優(yōu):軟、硬件與線上一致,如果條件不允許,可以先壓?jiǎn)螜C(jī),測(cè)出指標(biāo),然后增加一臺(tái)應(yīng)用服務(wù)器做集群,測(cè)出指標(biāo),按照增加時(shí)的損耗,換算出線上環(huán)境支持的并發(fā)指標(biāo)
4)測(cè)試執(zhí)行
客戶端的系統(tǒng)資源(cpu、io、memory)情況
服務(wù)端的系統(tǒng)資源(cpu、io、memory)情況
服務(wù)器的jvm運(yùn)行情況
服務(wù)端的應(yīng)用情況,看是否有異常
響應(yīng)時(shí)間、吞吐量等指標(biāo)
5)測(cè)試分析
根據(jù)測(cè)試保存的數(shù)據(jù)和運(yùn)行中的監(jiān)控?cái)?shù)據(jù)發(fā)現(xiàn)問(wèn)題
常見(jiàn)的問(wèn)題有:內(nèi)存問(wèn)題、有限資源競(jìng)爭(zhēng)問(wèn)題、軟件配置
內(nèi)存可以使用:jmap,jhat,jstat,可以得到內(nèi)存快照,得到堆內(nèi)存的詳細(xì)信息,或者使用met
共享資源競(jìng)爭(zhēng)問(wèn)題:一個(gè)共享資源在一個(gè)時(shí)間點(diǎn)上,只能被一個(gè)線程獲得,其他線程必須等待,這就容易造成很多線程的timedwait狀態(tài)。通過(guò)jprofiler工具,能夠得到線程快照,并分析改進(jìn)方法,也可以使用jstack打印棧信息進(jìn)行分析
6)總結(jié),輸出測(cè)試報(bào)告

12、設(shè)計(jì)性能測(cè)試方案需要考慮哪些問(wèn)題?

時(shí)間成本、人力成本、環(huán)境&腳本可復(fù)用性、實(shí)現(xiàn)難度

13、壓測(cè)中TPS上不去,那么你怎么分析這個(gè)問(wèn)題?
1、網(wǎng)絡(luò)帶寬
在壓力測(cè)試中,有時(shí)候要模擬大量的用戶請(qǐng)求,如果單位時(shí)間內(nèi)傳遞的數(shù)據(jù)包過(guò)大,超過(guò)了帶寬的傳輸能力,那么就會(huì)造成網(wǎng)絡(luò)資源競(jìng)爭(zhēng),間接導(dǎo)致服務(wù)端接收到的請(qǐng)求數(shù)達(dá)不到服務(wù)端的處理能力上限。

2、連接池
可用的連接數(shù)太少,造成請(qǐng)求等待。連接池一般分為服務(wù)器連接池(比如Tomcat)和數(shù)據(jù)庫(kù)連接池(或者理解為最大允許連接數(shù)也行)。

3、垃圾回收機(jī)制
從常見(jiàn)的應(yīng)用服務(wù)器來(lái)說(shuō),比如Tomcat,因?yàn)閖ava的的堆棧內(nèi)存是動(dòng)態(tài)分配,具體的回收機(jī)制是基于算法,如果新生代的Eden和Survivor區(qū)頻繁的進(jìn)行Minor GC,老年代的full GC也回收較頻繁,那么對(duì)TPS也是有一定影響的,因?yàn)槔厥掌浔旧砭蜁?huì)占用一定的資源。

4、數(shù)據(jù)庫(kù)配置
高并發(fā)情況下,如果請(qǐng)求數(shù)據(jù)需要寫(xiě)入數(shù)據(jù)庫(kù),且需要寫(xiě)入多個(gè)表的時(shí)候,如果數(shù)據(jù)庫(kù)的最大連接數(shù)不夠,或者寫(xiě)入數(shù)據(jù)的SQL沒(méi)有索引沒(méi)有綁定變量,抑或沒(méi)有主從分離、讀寫(xiě)分離等,就會(huì)導(dǎo)致數(shù)據(jù)庫(kù)事務(wù)處理過(guò)慢,影響到TPS。

5、通信連接機(jī)制
串行、并行、長(zhǎng)連接、管道連接等,不同的連接情況,也間接的會(huì)對(duì)TPS造成影響。

6、硬件資源
包括CPU(配置、使用率等)、內(nèi)存(占用率等)、磁盤(pán)(I/O、頁(yè)交換等)。

7、壓力機(jī)
比如jmeter,單機(jī)負(fù)載能力有限,如果需要模擬的用戶請(qǐng)求數(shù)超過(guò)其負(fù)載極限,也會(huì)間接影響TPS(這個(gè)時(shí)候就需要進(jìn)行分布式壓測(cè)來(lái)解決其單機(jī)負(fù)載的問(wèn)題)。

8、壓測(cè)腳本
還是以jemter舉個(gè)例子,之前工作中同事遇到的,進(jìn)行階梯式加壓測(cè)試,最大的模擬請(qǐng)求數(shù)超過(guò)了設(shè)置的線程數(shù),導(dǎo)致線程不足。提到這個(gè)原因,想表達(dá)意思是:有時(shí)候測(cè)試腳本參數(shù)配置等原因,也會(huì)影響測(cè)試結(jié)果。

9、業(yè)務(wù)邏輯
業(yè)務(wù)解耦度較低,較為復(fù)雜,整個(gè)事務(wù)處理線被拉長(zhǎng)導(dǎo)致的問(wèn)題。

10、系統(tǒng)架構(gòu)
比如是否有緩存服務(wù),緩存服務(wù)器配置,緩存命中率、緩存穿透以及緩存過(guò)期等,都會(huì)影響到測(cè)試結(jié)果。

14、測(cè)試環(huán)境和生產(chǎn)環(huán)境服務(wù)器配比肯定不一樣?怎么保證性能測(cè)試的數(shù)據(jù)正確性?

-版本一致性
  包括操作系統(tǒng)、數(shù)據(jù)庫(kù)、中間件的版本,jdk、被測(cè)系統(tǒng)的版本。
-配置一致性
  系統(tǒng)(操作系統(tǒng)/數(shù)據(jù)庫(kù)/中間件/被測(cè)試系統(tǒng))參數(shù)的配置一致,這些系統(tǒng)參數(shù)的配置有可能對(duì)系統(tǒng)造成巨大的影響。所以,除了保證測(cè)試環(huán)境與真實(shí)環(huán)境所使用的軟件版本一致,也要關(guān)注其參數(shù)的配置是否一致。

然后在單臺(tái)服務(wù)器上獲得具體的性能指標(biāo),每臺(tái)服務(wù)器能夠承受500用戶并發(fā),平均TPS為60,響應(yīng)時(shí)間為2秒,接著,添加負(fù)載均衡策略,再次測(cè)試負(fù)載策略下的數(shù)據(jù)損耗。得出數(shù)據(jù)后添加1臺(tái)負(fù)載均衡服務(wù)器,測(cè)試在兩臺(tái)服務(wù)器下每臺(tái)服務(wù)器的性能指標(biāo),以此類(lèi)推

15、如何準(zhǔn)備測(cè)試數(shù)據(jù)?如何防止數(shù)據(jù)污染?

生產(chǎn)數(shù)據(jù)備份、數(shù)據(jù)隔離、測(cè)試數(shù)據(jù)落入影子庫(kù)、擋板、mock都可以

16、線程和進(jìn)程的區(qū)別?
   進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是CPU工作時(shí)間段的描述,不過(guò)是顆粒大小不同;

   (1)進(jìn)程是資源的分配和調(diào)度的一個(gè)獨(dú)立單元,而線程是CPU調(diào)度的基本單元
      (2)同一個(gè)進(jìn)程中可以包括多個(gè)線程,并且線程共享整個(gè)進(jìn)程的資源(寄存器、堆棧、上下文),一個(gè)進(jìn)行至少包括一個(gè)線程。
      (3)進(jìn)程的創(chuàng)建調(diào)用fork或者vfork,而線程的創(chuàng)建調(diào)用pthread_create,進(jìn)程結(jié)束后它擁有的所有線程都將銷(xiāo)毀,而線程的結(jié)束不會(huì)影響同個(gè)進(jìn)程中的其他線程的結(jié)束
      (4)線程是輕兩級(jí)的進(jìn)程,它的創(chuàng)建和銷(xiāo)毀所需要的時(shí)間比進(jìn)程小很多,所有操作系統(tǒng)中的執(zhí)行功能都是創(chuàng)建線程去完成的
      (5)線程中執(zhí)行時(shí)一般都要進(jìn)行同步和互斥,因?yàn)樗麄児蚕硗贿M(jìn)程的所有資源
      (6)線程有自己的私有屬性TCB,線程id,寄存器、硬件上下文,而進(jìn)程也有自己的私有屬性進(jìn)程控制塊PCB,這些私有屬性是不被共享的,用來(lái)標(biāo)示一個(gè)進(jìn)程或一個(gè)線程的標(biāo)志

17、如果發(fā)現(xiàn)瓶頸,你怎么分析?

查找瓶頸時(shí)按以下順序,由易到難:服務(wù)器硬件瓶頸-〉網(wǎng)絡(luò)瓶頸(對(duì)局域網(wǎng),可以不考慮)-〉服務(wù)器操作系統(tǒng)瓶頸(參數(shù)配置)-〉中間件瓶頸(參數(shù)配置,數(shù)據(jù)庫(kù),web服務(wù)器等)-〉應(yīng)用瓶頸(SQL語(yǔ)句、數(shù)據(jù)庫(kù)設(shè)計(jì)、業(yè)務(wù)邏輯、算法等)

19、簡(jiǎn)單說(shuō)幾個(gè)Nginx、Tomcat中的配置參數(shù),參數(shù)是干什么的?

Nginx--配置文件名 nginx.conf
server_name:配置主機(jī)域名
Nginx:upstream,設(shè)置web服務(wù)器的ip、端口和權(quán)重
worker_connections:定義每個(gè)進(jìn)程的最大連接數(shù)
keepalive_timeout :設(shè)置客戶端連接保存活動(dòng)的超時(shí)時(shí)間
woker_precess :設(shè)置Nginx 啟動(dòng)多少個(gè)工作進(jìn)程的數(shù)量

Tomcat--配置文件名 server.xml
Connector port :配置端口
URIEncoding:解決中文亂碼
connectionTimeout: 連接超時(shí)時(shí)間(毫秒)
acceptCoumt="300" :指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),可以放到處理隊(duì)列中的請(qǐng)求數(shù),超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理
maxThreads="300" :允許最大的線程數(shù)
maxProcessors="1000" :同時(shí)最大的處理線程數(shù),如果系統(tǒng)中已經(jīng)有這個(gè)數(shù)字的線程,那么,更多的連接請(qǐng)求將進(jìn)入排隊(duì)(ACCEPT COUNT)
minProcessors="5" :最小的處理線程數(shù),即使沒(méi)有任何HTTP請(qǐng)求,TOMCAT也保持至少這么多線程以等待處理
JAVA_OPTS --Xms--Xxs :配置啟動(dòng)時(shí)初始內(nèi)存、最大內(nèi)存,一般配置一樣
session-timeout:session超時(shí)時(shí)間

20、Redis支持哪些數(shù)據(jù)類(lèi)型?

String字符串、Hash(哈希)、List(列表)、Set(集合) zset(sorted set:有序集合)

21、說(shuō)幾個(gè)你工作中調(diào)優(yōu)過(guò)的幾個(gè)實(shí)例
22、如果現(xiàn)在在壓測(cè)的時(shí)候cpu高,你怎么分析
23、你做性能測(cè)試一般遇到哪些類(lèi)型的性能問(wèn)題
  A. OOM內(nèi)存不足:1\. 不斷地申請(qǐng)對(duì)象,后面對(duì)象申請(qǐng)不到內(nèi)存資源(調(diào)整對(duì)象大小或擴(kuò)容);2\. 持續(xù)地啟線程,申請(qǐng)棧資源,造成內(nèi)存不足(調(diào)整每個(gè)線程的堆棧大小Xss=256或者擴(kuò)容)3\. 頻繁地觸發(fā)FULL GC,造成OOM(調(diào)整新生代GC大小或降低GC的執(zhí)行次數(shù))

  B. 內(nèi)存泄露:對(duì)象和線程等一直不釋放資源,導(dǎo)致內(nèi)存泄露(釋放不必要的引用、使用對(duì)象緩存池、采用合理的緩存失效算法、合理使用SoftReference和WeekReference:SoftReference的對(duì)象會(huì)在內(nèi)存不夠用的時(shí)候回收,WeekReference的對(duì)象會(huì)在Full GC的時(shí)候回收)

  C. 線程死鎖:兩個(gè)線程占用不同的資源不釋放,造成線程死鎖(規(guī)定資源執(zhí)行順序,但是也會(huì)造成鎖饑餓,解決辦法是減短鎖釋放時(shí)間)

  D. 鎖爭(zhēng)用:很多線程競(jìng)爭(zhēng)互斥資源,但資源有限, 造成其他線程都處于等待狀態(tài)(使用非阻塞隊(duì)列算法、拆分鎖,去除讀寫(xiě)操作的互斥,盡可能少用鎖)

  E. 堆棧資源不足:線程嵌套式地申請(qǐng)堆棧資源,導(dǎo)致堆棧資源不足(調(diào)整堆棧大?。?
  F. Java進(jìn)程消耗CPU過(guò)高:1\. us高:執(zhí)行線程不需要任何掛起動(dòng)作,且一直執(zhí)行,導(dǎo)致CPU 沒(méi)有機(jī)會(huì)去調(diào)度執(zhí)行其他的線程。(增加Thread.sleep,以釋放CPU 的執(zhí)行權(quán),降低CPU 的消耗);2\. sy高:線程的運(yùn)行狀態(tài)要經(jīng)常切換(降低線程數(shù)) 

  G. 文件IO消耗嚴(yán)重:多個(gè)線程在寫(xiě)進(jìn)行大量的數(shù)據(jù)到同一文件,導(dǎo)致文件很快變得很大,從而寫(xiě)入速度越來(lái)越慢,并造成各線程激烈爭(zhēng)搶文件鎖。(異步寫(xiě)文件、批量讀寫(xiě)、限流、限制文件大?。?
  H. 網(wǎng)絡(luò)IO消耗嚴(yán)重: 同時(shí)需要發(fā)送或接收的包太多。(限流,限流通常是限制發(fā)送packet的頻率,從而在網(wǎng)絡(luò)IO消耗可接受的情況下來(lái)發(fā)送packget。)

24、線程的狀態(tài)有幾種?

在Java當(dāng)中,線程通常都有五種狀態(tài),創(chuàng)建、就緒、運(yùn)行、阻塞和死亡。
1)第一是創(chuàng)建狀態(tài)。在生成線程對(duì)象,并沒(méi)有調(diào)用該對(duì)象的start方法,這是線程處于創(chuàng)建狀態(tài);
2)第二是就緒狀態(tài)。當(dāng)調(diào)用了線程對(duì)象的start方法之后,該線程就進(jìn)入了就緒狀態(tài),但是此時(shí)線程調(diào)度程序還沒(méi)有把該線程設(shè)置為當(dāng)前線程,此時(shí)處于就緒狀態(tài)。在線程運(yùn)行之后,從等待或者睡眠中回來(lái)之后,也會(huì)處于就緒狀態(tài)
3)第三是運(yùn)行狀態(tài)。線程調(diào)度程序?qū)⑻幱诰途w狀態(tài)的線程設(shè)置為當(dāng)前線程,此時(shí)線程就進(jìn)入了運(yùn)行狀態(tài),開(kāi)始運(yùn)行run函數(shù)當(dāng)中的代碼。
4)第四是阻塞狀態(tài)。線程正在運(yùn)行的時(shí)候,被暫停,通常是為了等待某個(gè)時(shí)間的發(fā)生(比如說(shuō)某項(xiàng)資源就緒)之后再繼續(xù)運(yùn)行。sleep,suspend等方法都可以導(dǎo)致線程阻塞。
5)第五是死亡狀態(tài)。如果一個(gè)線程的run方法執(zhí)行結(jié)束,該線程就會(huì)死亡。對(duì)于已經(jīng)死亡的線程,無(wú)法再使用start方法令其進(jìn)入就緒狀態(tài)。

image

java基礎(chǔ)

1、equals與==的區(qū)別

使用==比較原生類(lèi)型如:boolean、int、char等等,使用equals()比較對(duì)象。
1)==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間。 equals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同。
2)==是指對(duì)內(nèi)存地址進(jìn)行比較。 equals()是對(duì)字符串的內(nèi)容進(jìn)行比較。
3)==指引用是否相同。 equals()指的是值是否相同

2、成員變量與局部變量的區(qū)別有那些?

① 成員變量是輸入類(lèi)的,局部變量是在方法中定義的變量或是方法的參數(shù)
② 成員變量可以被public等修飾,局部變量不行
③ 成員變量是屬于對(duì)象的一部分,對(duì)象存在于堆內(nèi)存中;局部變量存在于棧內(nèi)存中
④ 成員變量值聲明不賦值的話,會(huì)自動(dòng)以類(lèi)型的默認(rèn)值賦值;局部變量不會(huì)自動(dòng)賦值;
⑤ 成員變量隨著對(duì)象的創(chuàng)建而存在;局部變量隨著方法的調(diào)用也消失

3、.講講對(duì)static的理解?J

靜態(tài)變量:
① 一個(gè)類(lèi)只有一份被類(lèi)的所有實(shí)例共享
② 能在沒(méi)有生成任何類(lèi)的實(shí)例時(shí)就被訪問(wèn)到
③ 直接使用類(lèi)名來(lái)訪問(wèn)
靜態(tài)方法:
① 可以在沒(méi)有任何實(shí)例時(shí)調(diào)用
② 不能在static方法內(nèi)部訪問(wèn)非static成員
③ 不能被重寫(xiě)

4、 重寫(xiě)和重載的區(qū)別?

重載規(guī)則:必須具有不同的參數(shù)列表; 可以有不同的返回類(lèi)型;可以有不同的訪問(wèn)修飾符;可以拋出不同的異常。
重寫(xiě)規(guī)則:參數(shù)列表必須完全與被重寫(xiě)的方法相同,否則不能稱其為重寫(xiě)而是重載;返回類(lèi)型必須一直與被重寫(xiě)的方法相同,否則不能稱其為重寫(xiě)而是重載;
訪問(wèn)修飾符的限制一定要大于等于被重寫(xiě)方法的訪問(wèn)修飾符;
重寫(xiě)方法一定不能拋出新的檢查異?;蛘弑缺恢貙?xiě)方法申明更加寬泛的檢查型異常,譬如父類(lèi)方法聲明了一個(gè)檢查異常 IOException,在重寫(xiě)這個(gè)方法時(shí)就不能拋出 Exception,只能拋出 IOException 的子類(lèi)異常,可以拋出非檢查異常。

15、Reader和InputStream區(qū)別?

都是抽象類(lèi),Reader用于讀取字符流(char或String),InputStream用于讀取字節(jié)流(byte數(shù)組)

5、抽象類(lèi)和interface的區(qū)別

① 抽象類(lèi)可以有構(gòu)造方法,接口中不能有構(gòu)造方法
② 抽象類(lèi)中可以有普通成員變量,接口中沒(méi)有普通成員變量
③ 抽象類(lèi)中可以包含非抽象普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的方法。
④ 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)隔開(kāi),但只能繼承一個(gè)抽象類(lèi),接口不可以實(shí)現(xiàn)接口,但可以繼承接口,并且可以繼承多個(gè)接口,用逗號(hào)隔開(kāi)。
⑤ 抽象類(lèi)和接口中都可以包含靜態(tài)成員變量,抽象類(lèi)中的靜態(tài)成員變量的訪問(wèn)權(quán)限可以是任意的,但接口中定義的變量只能是 public static final 類(lèi)型的,并且默認(rèn)即為 public static final 類(lèi)型

6、Java支持多繼承么?如果不支持,如何實(shí)現(xiàn)?

不支持,Java不支持多繼承。每個(gè)類(lèi)都只能繼承一個(gè)類(lèi),實(shí)現(xiàn)多繼承有兩種方式,一是接口,而是內(nèi)部類(lèi)

7、構(gòu)造器(constructor)是否可被重寫(xiě)(override)?

構(gòu)造方法是不能被子類(lèi)重寫(xiě)的,但是構(gòu)造方法可以重載
簡(jiǎn)單的講,就是說(shuō)一個(gè)類(lèi)可以有多個(gè)構(gòu)造方法。

8、Array和ArrayList有什么區(qū)別?

可以將 ArrayList想象成一種“會(huì)自動(dòng)擴(kuò)增容量的Array”。
① Array類(lèi)型的變量在聲明的同時(shí)必須進(jìn)行實(shí)例化(至少得初始化數(shù)組的大小),而ArrayList可以只是先聲明
② Array對(duì)象的初始化必須只定指定大小,且創(chuàng)建后的數(shù)組大小是固定的,ArrayList的大小可以動(dòng)態(tài)指定,其大小可以在初始化時(shí)指定,也可以不指定,也就是說(shuō)該對(duì)象的空間可以任意增加

9、簡(jiǎn)述Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?

答:重載(overloading)、重寫(xiě)(overriding)
1.重載(overloading):是一個(gè)類(lèi)中多態(tài)的表現(xiàn),比如一個(gè)類(lèi)中定義多個(gè)同名的方法,但它們具有不同的參數(shù)或不同參數(shù)類(lèi)型都稱之為重載。
2.重寫(xiě)(overriding):子類(lèi)定義一個(gè)方法和父類(lèi)的方法名稱參數(shù)都相同,那么父類(lèi)的方法被重寫(xiě)。

10、.簡(jiǎn)述java中super()和this()、super和this的區(qū)別?

答:①.super()和this()區(qū)別:
super():調(diào)用父類(lèi)無(wú)形參的構(gòu)造方法;
super(形參):調(diào)用父類(lèi)中某個(gè)帶形參的構(gòu)造方法;
this(形參):調(diào)用本類(lèi)中另一種形式的構(gòu)造方法
注意:放在方法的首行;
② .super和this的區(qū)別:
super.父類(lèi)的成員變量;
super.父類(lèi)的方法;
super:當(dāng)子類(lèi)中的成員變量、方法和父類(lèi)的相同時(shí),實(shí)現(xiàn)調(diào)用父類(lèi)的成員變量和方法;
this:代表當(dāng)前的對(duì)象;
使用的地方:若函數(shù)的形參和成員變量同名時(shí),需要用this.成員變量名

11、Java中有哪些基本數(shù)據(jù)類(lèi)型?String是基本數(shù)據(jù)類(lèi)型嗎?String類(lèi)是否能夠繼承?

答:
①.java定義了4中類(lèi)8種基本類(lèi)型:
整型:byte、short、int、long
浮點(diǎn)型:float、double
布爾型: boolean
字符型: char
②.String不是基本數(shù)據(jù)類(lèi)型,String屬于引用類(lèi)型。
③.String類(lèi)是一個(gè)final類(lèi),因此不能被繼承。

12、.Integer和int的區(qū)別?

答:Integer是一個(gè)封裝int類(lèi)型的封裝類(lèi),默認(rèn)值為null,int是Java中8中數(shù)據(jù)類(lèi)型之一,默認(rèn)值為0.

13、String s=new String(“xyz”)創(chuàng)建了幾個(gè)對(duì)象?

答:創(chuàng)建2個(gè)String對(duì)象,一個(gè)是=null的s,一個(gè)是=“xyz”的string。

14、Java中堆和棧有什么不同?

每個(gè)線程都有自己的棧內(nèi)存,用于存儲(chǔ)本地變量,方法參數(shù)和棧調(diào)用,一個(gè)線程中存儲(chǔ)的變量對(duì)其它線程是不可見(jiàn)的。而堆是所有線程共享的一片公用內(nèi)存區(qū)域。

數(shù)據(jù)庫(kù)

1、數(shù)據(jù)庫(kù)的樂(lè)觀鎖和悲觀鎖是什么?

確保在多個(gè)事務(wù)同時(shí)存取數(shù)據(jù)庫(kù)中同一數(shù)據(jù)時(shí)不破壞事務(wù)的隔離性和統(tǒng)一性以及數(shù)據(jù)庫(kù)的統(tǒng)一性,樂(lè)觀鎖和悲觀鎖是并發(fā)控制主要采用的技術(shù)手段。

  • 悲觀鎖:假定會(huì)發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作
    在查詢完數(shù)據(jù)的時(shí)候就把事務(wù)鎖起來(lái),直到提交事務(wù)
    實(shí)現(xiàn)方式:使用數(shù)據(jù)庫(kù)中的鎖機(jī)制
  • 樂(lè)觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性。
    在修改數(shù)據(jù)的時(shí)候把事務(wù)鎖起來(lái),通過(guò)version的方式來(lái)進(jìn)行鎖定
    實(shí)現(xiàn)方式:使用version版本或者時(shí)間戳
2、varchar和char的區(qū)別

Char是一種固定長(zhǎng)度的類(lèi)型,varchar是一種可變長(zhǎng)度的類(lèi)型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容