李明杰(MJ)高级讲师
多年软件开发经验和教学经验,尤其精通Android和iOS平台的开发,还开发了2个iOS的流行开源框架(MJRefresh、MJExtension),
目前在国内的使用率非常高。
李老师曾负责主导开发过装饰ERP系统手机端、服装连锁管理系统手机及平板客户端、自动鸡尾酒调酒机系统、网络斗地主RPG、游戏
引擎等。曾以架构师及技术总监的角色帮客户成功获得多家风投,并上了中央电视台《给你一个亿》节目。除了Android和iOS平台,李老师也深入研究
HTML5、phoneGap、Sencha-Touch、Less、Bootstrap、AngularJS、NodeJS等前端利器。
2015年8月 CCTV发现之旅《华商论见》栏目特约嘉宾,受邀参加节目《互联网 浪潮下的创业之道》,接受央视著名主持人水均益采
访。2015年10月 曾受邀加入中国经贸代表团随总理出访韩国,参与总理访韩午餐会以及中日韩工商峰会。2015年12月 荣获中国经济新模
式创新与发展峰会“2015中国IT教育培训行业**具创新人物”奖。
李老师不但具有丰富的软件开发经验,并且懂得如何把自己掌握的知识及技能传授给他人,曾给多家企业提供Android/iOS技术培训
、技术支持、技术咨询等服务。李老师的授课视频深得学生们的喜爱,已培养出好几千名iOS程序员。
培训Java与自学Java的差距
我以前也是自学Java,在一家公司跟着别人学,以前是别人眼中的菜鸟,现
在是别人眼中的大神,Java很简单的,贵在坚持和多练,没必要花那培训钱。如果真的要去学的话,
选择Java培训机构要注意这两点基本上就能避免一些坑:
1. 老师没有正经公司工作经历,或者没有已经在线上正常运转的产品。一
些所谓培训班的老师水平往往比较一般,甚至还有培训出来后又接着培训别人的。
2、是不是会承诺帮你找到工作,要找到好的工作,不是靠别人给你保证的
,还是要靠自己提升能力。
建议多自己学习加上找些好的代码主动学习。例如github,多练习网上很多
网站里真正好的代码。作为Java工程师,可以多看看spring文档,看看很多已经成熟的框架,深入去体会。另外,学软件等等**好还是自己多学,找点
视频教程之类,也省点钱。
JAVA 课程
一、课程简介
??学士后java软件工程师课程是专门针对大专或以上学历,在职、待业人群
精心设计、打造的教育培训产品。学习的方法也是非常的立体,线上线下相结合,小班面授,面授的更是企业所需的技术和经验。每一位老师都是有真
正的实战经验,经历过重重的考核才能成为我们的技术老师。丰富的实战经验和教学经验可以把你快速的训练成实用型的技术人才。
学士后java软件工程师课程学成之后也得到了劳动与人力资源社会部的认可
,学员**考试后可获得承认的java软件开发认证证书。
二、培养目标
1、精通JavaEE平台开发的java软件工程师,能够胜任各种行业的企业级软
件开发工作;
2、具备一年以上软件开发经验;
3、熟悉java软件开发流程;
4、良好的语言表达、沟通能力、工作责任心和团队意识。
三、课程设计
四、胜任职位
java大数据、Java(JavaEE)工程师、.NET软件工程师、外包开发工程师、网
站设计和开发工程师、数据库工程师、ERP/CRM/OA/B2C开发应用工程师、系统分析设计工程师、文档工程师
五、招生对象
年满20周岁,大专及大专以上学历
?适合大学生、在职提升、转行或待业人群等有志于进入IT软件行业发展的
人群。
JVM-OutOfMemory异常重现
>
原文地址http://blog.csdn.net/zhshulin/article/details/50571469
JVM中常见的OOM,那么如何**自己编写代码产生这些OOM异常呢?**写代码重现异常,是为了避免在工作中写出有OOM BUG的代码。之前虽然看过相关文章,但是没自己写过这些代码,这次在编写的实际过程中,由于和书本使用的JDK版本不一致,也会有点问题。其中印象**深刻的就是从JDK1.7开始常量池就已经不放在方法区了,而是改到了java堆中,所以《深入理解JAVA虚拟机》中的有些知识也需要更新了。下面的代码基于JDK1.7来的。并且在运行程序的时候需要设置JVM参数,如果不设置,轻则需要等待很长时间才会出现异常,重则系统假死甚至导致系统内存溢出。
在测试直接内存的时候,引用了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;
/**
* 测试在代码中如何产生堆内存溢出、栈溢出(超出长度)、栈内存溢出(栈不能扩展的情况下OOM)、方法区内存溢出、常量池内存溢出
* 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>();
//一个普通的对象
static class OOMObjectClass{
public OOMObjectClass(){}
}
/**
* **list对象保持对对象列表的引用,不然GC收集对象,然后不断地向列表中添加新的对象,就会发生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());
}
}
/**
* **递归调用方法,从而让方法栈产生栈 StackOverflowError
*
* @VM args:-verbose:gc -Xss128k
*/
public void stackLeak(){
count ;
stackLeak();
}
/**
* 除了上述的递归调用可以产生溢出外,还有就是过多的线程,当栈内存无法动弹扩展是,会出现OOM
*
* 由于在Window的JVM中,Jave的线程是映射到了操作系统的内核线程上,故而这段代码的运行时非常危险的
* 笔者运行的时候限制了JVM内存大小,但是栈内存可以动态扩展,所以电脑内存直接到了90%以上,我果断停止了程序的运行
* 由于栈内存只由-Xss参数控制,并没有办法让其不自动扩展,所以这段代码非常危险
* 参数:-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 ;
}
}
/**
* 常量池是存在于方法区内的,故而只要限制了方法区的大小,当不断新增常量的时候就会发生常量池的溢出
*
* 笔者使用的是JDK1.7 64位,此时的常量池已经不存在与方法区中,而是迁移到了堆中,故而测试的时候需要限制JVM的堆大小,且不能自动扩展
* @VM args: -Xms10M -Xmx10M
*/
public void constantPoolOOM(){
int i=0;
while(true){
list.add(String.valueOf(i ).intern()); //String类型的intern方法是将字符串的值放到常量池中
}
}
/**
* 方法区是存放一些类的信息等,所以我们可以使用类加载无限循环加载class,这样就会出现方法区的OOM异常
* 主要,使用内部类的时候,需要要使用静态内部类,如果使用的是非静态内部类,将不会发生方法区OOM
* 使用了CGLib直接操作字节码运行时,生成了大量的动态类
* 需要者两个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();
}
}
/**
* 要讨论这部分的内存溢出,首先必须要说一下什么是直接内存:
* 直接内存并不是JVM运行时数据区的一部分,也不是JVM规范中定义的内存区域,但是这部分内存也被频繁的使用,也会产生OOM。
* JDK1.4中新加入了NIO类,引入了一种Channel与Buffer的I/O方式,它可以使用Native函数库直接分配堆外内存,然后**一个存储在JAVA堆里面的DirectByteBuffer对象作为
* 这些堆外内存的引用进而操作,这样在某些场景中可以显著的提高性能,避免了在native堆和java堆中来回复制数据。这这部分堆外内存就是直接内存了。
*
* 直接内存虽然不会受到JAVA堆大小的限制,但是还是会受到本机内存大小的限制,故而服务器管理员在设置JVM内存管理参数的时候,如果忘记了直接内存,那么当程序进行动态扩展的时候,就有可能发生OOM
* 直接内存的容量可以**-XX:MaxDirectMemorySize指定,如果不指定,那么默认与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();
// ---------测试堆内存溢出-----------
// oom.testHeapOOM();
// ---------测试栈溢出----------
// try{
// oom.stackLeak();
// }catch(Throwable error){
// System.out.println("Stack length-->" count);
// throw error;
// }
// ---------测试由于栈动态扩展导致的OOM----------
// try{
// oom.stackLeakByThread();
// }catch(Throwable error){
// System.out.println("Stack length-->" count);
// throw error;
// }
// ----------测试方法区溢出----------
// oom.methodAreaOOM();
// ----------测试常量池溢出----------
// oom.constantPoolOOM();
// ----------测试直接内存溢出----------
try {
oom.directMemoryOOM();
} catch (Exception e) {
System.out.println(e);
}
}
}
相关推荐:
苏州JAVA培训 苏州JAVA培训班 苏州JAVA培训机构