李明杰(MJ)高級(jí)講師
多年軟件開發(fā)經(jīng)驗(yàn)和教學(xué)經(jīng)驗(yàn),尤其精通Android和iOS平臺(tái)的開發(fā),還開發(fā)了2個(gè)iOS的流行開源框架(MJRefresh、MJExtension),
目前在國內(nèi)的使用率非常高。
李老師曾負(fù)責(zé)主導(dǎo)開發(fā)過裝飾ERP系統(tǒng)手機(jī)端、服裝連鎖管理系統(tǒng)手機(jī)及平板客戶端、自動(dòng)雞尾酒調(diào)酒機(jī)系統(tǒng)、網(wǎng)絡(luò)斗地主RPG、游戲
引擎等。曾以架構(gòu)師及技術(shù)總監(jiān)的角色幫客戶成功獲得多家風(fēng)投,并上了中央電視臺(tái)《給你一個(gè)億》節(jié)目。除了Android和iOS平臺(tái),李老師也深入研究
HTML5、phoneGap、Sencha-Touch、Less、Bootstrap、AngularJS、NodeJS等前端利器。
2015年8月 CCTV發(fā)現(xiàn)之旅《華商論見》欄目特約嘉賓,受邀參加節(jié)目《互聯(lián)網(wǎng) 浪潮下的創(chuàng)業(yè)之道》,接受央視著名主持人水均益采
訪。2015年10月 曾受邀加入中國經(jīng)貿(mào)代表團(tuán)隨總理出訪韓國,參與總理訪韓午餐會(huì)以及中日韓工商峰會(huì)。2015年12月 榮獲中國經(jīng)濟(jì)新模
式創(chuàng)新與發(fā)展峰會(huì)“2015中國IT教育培訓(xùn)行業(yè)**具創(chuàng)新人物”獎(jiǎng)。
李老師不但具有豐富的軟件開發(fā)經(jīng)驗(yàn),并且懂得如何把自己掌握的知識(shí)及技能傳授給他人,曾給多家企業(yè)提供Android/iOS技術(shù)培訓(xùn)
、技術(shù)支持、技術(shù)咨詢等服務(wù)。李老師的授課視頻深得學(xué)生們的喜愛,已培養(yǎng)出好幾千名iOS程序員。
Java培訓(xùn)Java與自學(xué)Java的差距
培訓(xùn)Java與自學(xué)Java的差距
我以前也是自學(xué)Java,在一家公司跟著別人學(xué),以前是別人眼中的菜鳥,現(xiàn)
在是別人眼中的大神,Java很簡(jiǎn)單的,貴在堅(jiān)持和多練,沒必要花那培訓(xùn)錢。如果真的要去學(xué)的話,
選擇Java培訓(xùn)機(jī)構(gòu)要注意這兩點(diǎn)基本上就能避免一些坑:
1. 老師沒有正經(jīng)公司工作經(jīng)歷,或者沒有已經(jīng)在線上正常運(yùn)轉(zhuǎn)的產(chǎn)品。一
些所謂培訓(xùn)班的老師水平往往比較一般,甚至還有培訓(xùn)出來后又接著培訓(xùn)別人的。
2、是不是會(huì)承諾幫你找到工作,要找到好的工作,不是靠別人給你保證的
,還是要靠自己提升能力。
建議多自己學(xué)習(xí)加上找些好的代碼主動(dòng)學(xué)習(xí)。例如github,多練習(xí)網(wǎng)上很多
網(wǎng)站里真正好的代碼。作為Java工程師,可以多看看spring文檔,看看很多已經(jīng)成熟的框架,深入去體會(huì)。另外,學(xué)軟件等等**好還是自己多學(xué),找點(diǎn)
視頻教程之類,也省點(diǎn)錢。
JAVA 課程
一、課程簡(jiǎn)介
??學(xué)士后java軟件工程師課程是專門針對(duì)大?;蛞陨蠈W(xué)歷,在職、待業(yè)人群
精心設(shè)計(jì)、打造的教育培訓(xùn)產(chǎn)品。學(xué)習(xí)的方法也是非常的立體,線上線下相結(jié)合,小班面授,面授的更是企業(yè)所需的技術(shù)和經(jīng)驗(yàn)。每一位老師都是有真
正的實(shí)戰(zhàn)經(jīng)驗(yàn),經(jīng)歷過重重的考核才能成為我們的技術(shù)老師。豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)和教學(xué)經(jīng)驗(yàn)可以把你快速的訓(xùn)練成實(shí)用型的技術(shù)人才。
學(xué)士后java軟件工程師課程學(xué)成之后也得到了勞動(dòng)與人力資源社會(huì)部的認(rèn)可
,學(xué)員**考試后可獲得承認(rèn)的java軟件開發(fā)認(rèn)證證書。
二、培養(yǎng)目標(biāo)
1、精通JavaEE平臺(tái)開發(fā)的java軟件工程師,能夠勝任各種行業(yè)的企業(yè)級(jí)軟
件開發(fā)工作;
2、具備一年以上軟件開發(fā)經(jīng)驗(yàn);
3、熟悉java軟件開發(fā)流程;
4、良好的語言表達(dá)、溝通能力、工作責(zé)任心和團(tuán)隊(duì)意識(shí)。
三、課程設(shè)計(jì)
四、勝任職位
java大數(shù)據(jù)、Java(JavaEE)工程師、.NET軟件工程師、外包開發(fā)工程師、網(wǎng)
站設(shè)計(jì)和開發(fā)工程師、數(shù)據(jù)庫工程師、ERP/CRM/OA/B2C開發(fā)應(yīng)用工程師、系統(tǒng)分析設(shè)計(jì)工程師、文檔工程師
五、招生對(duì)象
年滿20周歲,大專及大專以上學(xué)歷
?適合大學(xué)生、在職提升、轉(zhuǎn)行或待業(yè)人群等有志于進(jìn)入IT軟件行業(yè)發(fā)展的
人群。
JVM-OutOfMemory異常重現(xiàn)
>
原文地址http://blog.csdn.net/zhshulin/article/details/50571469
JVM中常見的OOM,那么如何**自己編寫代碼產(chǎn)生這些OOM異常呢?**寫代碼重現(xiàn)異常,是為了避免在工作中寫出有OOM BUG的代碼。之前雖然看過相關(guān)文章,但是沒自己寫過這些代碼,這次在編寫的實(shí)際過程中,由于和書本使用的JDK版本不一致,也會(huì)有點(diǎn)問題。其中印象**深刻的就是從JDK1.7開始常量池就已經(jīng)不放在方法區(qū)了,而是改到了java堆中,所以《深入理解JAVA虛擬機(jī)》中的有些知識(shí)也需要更新了。下面的代碼基于JDK1.7來的。并且在運(yùn)行程序的時(shí)候需要設(shè)置JVM參數(shù),如果不設(shè)置,輕則需要等待很長時(shí)間才會(huì)出現(xiàn)異常,重則系統(tǒng)假死甚至導(dǎo)致系統(tǒng)內(nèi)存溢出。
在測(cè)試直接內(nèi)存的時(shí)候,引用了rt.jar中的sun.misc.Unsafe類,如果使用了Eclipse作為IDE,需要修改windows-->PReferences-->java-->compiler-->Errors/Warinings,選擇Deprecated
and restricted API,將Forbidden reference(access rules)修改成ignore。
[java] view
plain copy
print?
package org.zsl.learn.oom;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import sun.misc.Unsafe;
/**
* 測(cè)試在代碼中如何產(chǎn)生堆內(nèi)存溢出、棧溢出(超出長度)、棧內(nèi)存溢出(棧不能擴(kuò)展的情況下OOM)、方法區(qū)內(nèi)存溢出、常量池內(nèi)存溢出
* JDK1.7
* @author Administrator
*
*/
public class TestOOM {
private static int count = 1;
private static final int _1MB = 1024*1024;
List<String> list = new ArrayList<String>();
//一個(gè)普通的對(duì)象
static class OOMObjectClass{
public OOMObjectClass(){}
}
/**
* **list對(duì)象保持對(duì)對(duì)象列表的引用,不然GC收集對(duì)象,然后不斷地向列表中添加新的對(duì)象,就會(huì)發(fā)生OOM
*
* @VM args:-verbose:gc -Xms10M -Xmx10M -XX: PrintGCDetails -XX:SurvivorRatio=8 -XX: HeapDumpOnOutOfMemoryError
*/
public void testHeapOOM(){
List<OOMObjectClass> list = new ArrayList<>();
while(true){
list.add(new OOMObjectClass());
}
}
/**
* **遞歸調(diào)用方法,從而讓方法棧產(chǎn)生棧 StackOverflowError
*
* @VM args:-verbose:gc -Xss128k
*/
public void stackLeak(){
count ;
stackLeak();
}
/**
* 除了上述的遞歸調(diào)用可以產(chǎn)生溢出外,還有就是過多的線程,當(dāng)棧內(nèi)存無法動(dòng)彈擴(kuò)展是,會(huì)出現(xiàn)OOM
*
* 由于在Window的JVM中,Jave的線程是映射到了操作系統(tǒng)的內(nèi)核線程上,故而這段代碼的運(yùn)行時(shí)非常危險(xiǎn)的
* 筆者運(yùn)行的時(shí)候限制了JVM內(nèi)存大小,但是棧內(nèi)存可以動(dòng)態(tài)擴(kuò)展,所以電腦內(nèi)存直接到了90%以上,我果斷停止了程序的運(yùn)行
* 由于棧內(nèi)存只由-Xss參數(shù)控制,并沒有辦法讓其不自動(dòng)擴(kuò)展,所以這段代碼非常危險(xiǎn)
* 參數(shù):-verbose:gc -Xms10M -Xmx10M -Xss2M
*/
public void stackLeakByThread(){
while(true){
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true){
}
}
});
t.start();
count ;
}
}
/**
* 常量池是存在于方法區(qū)內(nèi)的,故而只要限制了方法區(qū)的大小,當(dāng)不斷新增常量的時(shí)候就會(huì)發(fā)生常量池的溢出
*
* 筆者使用的是JDK1.7 64位,此時(shí)的常量池已經(jīng)不存在與方法區(qū)中,而是遷移到了堆中,故而測(cè)試的時(shí)候需要限制JVM的堆大小,且不能自動(dòng)擴(kuò)展
* @VM args: -Xms10M -Xmx10M
*/
public void constantPoolOOM(){
int i=0;
while(true){
list.add(String.valueOf(i ).intern()); //String類型的intern方法是將字符串的值放到常量池中
}
}
/**
* 方法區(qū)是存放一些類的信息等,所以我們可以使用類加載無限循環(huán)加載class,這樣就會(huì)出現(xiàn)方法區(qū)的OOM異常
* 主要,使用內(nèi)部類的時(shí)候,需要要使用靜態(tài)內(nèi)部類,如果使用的是非靜態(tài)內(nèi)部類,將不會(huì)發(fā)生方法區(qū)OOM
* 使用了CGLib直接操作字節(jié)碼運(yùn)行時(shí),生成了大量的動(dòng)態(tài)類
* 需要者兩個(gè)jar包:cglib-2.2.2.jar asm-3.1.jar
* @VM args:-XX:PermSize=10M -XX:MaxPermSize=10M
*/
public void methodAreaOOM(){
while(true){
Enhancer eh = new Enhancer();
eh.setSuperclass(OOMObjectClass.class);
eh.setUseCache(false);
eh.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
return arg3.invokeSuper(arg0, arg2);
}
});
eh.create();
}
}
/**
* 要討論這部分的內(nèi)存溢出,首先必須要說一下什么是直接內(nèi)存:
* 直接內(nèi)存并不是JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是JVM規(guī)范中定義的內(nèi)存區(qū)域,但是這部分內(nèi)存也被頻繁的使用,也會(huì)產(chǎn)生OOM。
* JDK1.4中新加入了NIO類,引入了一種Channel與Buffer的I/O方式,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存,然后**一個(gè)存儲(chǔ)在JAVA堆里面的DirectByteBuffer對(duì)象作為
* 這些堆外內(nèi)存的引用進(jìn)而操作,這樣在某些場(chǎng)景中可以顯著的提高性能,避免了在native堆和java堆中來回復(fù)制數(shù)據(jù)。這這部分堆外內(nèi)存就是直接內(nèi)存了。
*
* 直接內(nèi)存雖然不會(huì)受到JAVA堆大小的限制,但是還是會(huì)受到本機(jī)內(nèi)存大小的限制,故而服務(wù)器管理員在設(shè)置JVM內(nèi)存管理參數(shù)的時(shí)候,如果忘記了直接內(nèi)存,那么當(dāng)程序進(jìn)行動(dòng)態(tài)擴(kuò)展的時(shí)候,就有可能發(fā)生OOM
* 直接內(nèi)存的容量可以**-XX:MaxDirectMemorySize指定,如果不指定,那么默認(rèn)與JAVA堆得**大值一樣。
*
* @VM args:-Xmx20M -XX:MaxDirectMemorySize=10M
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public void directMemoryOOM() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe)unsafeField.get(null);
while(true){
unsafe.allocateMemory(_1MB);
}
}
public static void main(String[] args) {
TestOOM oom = new TestOOM();
// ---------測(cè)試堆內(nèi)存溢出-----------
// oom.testHeapOOM();
// ---------測(cè)試棧溢出----------
// try{
// oom.stackLeak();
// }catch(Throwable error){
// System.out.println("Stack length-->" count);
// throw error;
// }
// ---------測(cè)試由于棧動(dòng)態(tài)擴(kuò)展導(dǎo)致的OOM----------
// try{
// oom.stackLeakByThread();
// }catch(Throwable error){
// System.out.println("Stack length-->" count);
// throw error;
// }
// ----------測(cè)試方法區(qū)溢出----------
// oom.methodAreaOOM();
// ----------測(cè)試常量池溢出----------
// oom.constantPoolOOM();
// ----------測(cè)試直接內(nèi)存溢出----------
try {
oom.directMemoryOOM();
} catch (Exception e) {
System.out.println(e);
}
}
}
相關(guān)推薦:
蘇州JAVA培訓(xùn) 蘇州JAVA培訓(xùn)班 蘇州JAVA培訓(xùn)機(jī)構(gòu)
體驗(yàn)課預(yù)約試聽
倒計(jì)時(shí)
12:00:00