Java随笔

刚学Java不久,这里记录日常工作和学习中遇见的问题,都是入门级知识点。

1. Uninstall intellij

由于本地的Jetty一直跑不起来,已经影响到日常的开发工作,在报错实在没有办法解决的情况下,只能选择格式化重来,在此我表示很伤心。好吧,那就伤心地记录下intellij idea卸载的过程

macos上选择应用程序intellij,将其移动到废纸篓里面,这样其实不能干净卸载intellij,按照下面步骤可以清理干净:
rm -rf  /Library//Preferences/IdeaIC13
rm -rf  /Library//Caches/IdeaIC13
rm -rf  /Library//Application Support/IdeaIC13
rm -rf  /Library/Logs/IdeaIC13

清理掉Config, System, Plugins, Logs 应该就干净了。

2. Maven Jetty启动报错:PermGen space

报错内容如下:

[INFO] Started Jetty Server
[INFO] Starting scanner at interval of 20 seconds.
But at the first scan i get the following error:
ERROR ContextLoader - Context initialization failed
java.lang.OutOfMemoryError: PermGen space

解决方法,加上:-Xmx1024m -Xms1024m -XX:PermSize=512m

永久区内存溢出.png

有时候我们需要远程调试,IDea支持远程调试功能:


image.png

将Host和Port改成远程机器的IP和端口,那么远程JVM启动的时候加上参数:
JVM_ARGS ="****(其他参数) -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8417"

3. Java 主线程和子线程的关系

Java认为:并不存在java的主线程和子线程之分,都只是个普通的线程。进程的资源是线程共享的,只要进程还在,线程就可以正常执行,换句话说线程是强依赖于进程的。也就是说,线程其实并不存在互相依赖的关系,一个线程的死亡从理论上来说,不会对其他线程有什么影响。JVM可以理解为进程,只要JVM还在线程就有执行的机会。
这点跟Golang不同,Golang里面主协程一旦退出,子协程就没有执行的机会了,Golang是通过Channel完成多协程之间的通信。

4. Java 多线程的创建

(1) 继承Thread
class CustomThread extends Thread {
    @Override
    public void run() {
        System.out.println("子线程ID:"+Thread.currentThread().getId());
        System.out.println("我继承Thread类,处理任务的逻辑");
    }
}
public class MoreThread {
    public static void main(String[] args) {
        System.out.println("主线程ID:"+Thread.currentThread().getId());
        new CustomThread().start();
    }
}
(2) 实现Runnable
class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println("子线程ID:"+Thread.currentThread().getId());
        System.out.println("我实现Runnable接口, 处理任务的逻辑");
    }
}
public class MoreThread {
    public static void main(String[] args) {
        System.out.println("主线程ID:"+Thread.currentThread().getId());
        new Thread(new MyThread()).start();
    }
}
(3) ExecutorService、Callable、Future有返回结果的多线程

class CallableImpl implements Callable<Integer> {
    public Integer call() throws Exception {
        Integer sum = 0;
        System.out.println("Callable子线程开始计算啦!");
        for (int i=0; i<50; i++){
            sum = sum + I;
        }
        System.out.println("Callable子线程计算结束!");
        return sum;
    }
}

public class MoreThread {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        CallableImpl callable = new CallableImpl();
        Future<Integer> future = executorService.submit(callable);
        executorService.shutdown();
        try{
            Thread.sleep(2000);
            System.out.println("主线程有其他任务在执行");
            if (future != null && future.get() != null) {
                System.out.println("future.get()-->"+future.get());
            } else {
                System.out.println("future.get()未获取到结果");
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("主线程在执行完成");
    }
}

5. Java 泛型

Java泛型出来之前,java是如何做泛型的呢?

private static void print(Object object) {
        System.out.println(object.getClass().getName().toString());
        if (object instanceof Integer) {
            System.out.println(1);
        } else if (object instanceof String) {
            System.out.println("cd1");
        }

    }

是的,通过反射或者强制类型转化来达到类型匹配的目的。Java中的Object就相当于Golang中的interface,容纳一切类型。
Java的泛型非常强大,强大到无处不在。同时Java的泛型只在编译阶段有效,在编译之后程序会采取去泛型化的措施。也就是说Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。http://www.jianshu.com/p/95f349258afbhttp://blog.csdn.net/s10461/article/details/53941091文章写得不错。
Java中泛型分为:泛型类,泛型方法,泛型接口三大类。Java的泛型通配符?, T, K,V,E的含义:

? 表示不确定的java类型
** T (type)** 表示具体的一个java类型
K V (key value) 分别代表java键值中的Key Value
E (element) 代表Element

6. Maven

maven是java中非常棒的包管理工具,如果你想发布一个jar包到平台上去,只需要执行:mvn deploy。但经常会出现:

Error occurred during initialization of VM
Too small initial heap

解决方法:

export MAVEN_OPTS=-Xmx1024m

加到环境变量里面,然后 source /etc/profile 即可。

7. ThreadLocal

先给出它的用途,ThreadLocal和Synchonized都用于解决多线程并发訪问。但它们有本质的不同,Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
这里想问一个问题,Golang为什么不搞一个thread local storage呢?Rob Pike先生是如何看待threadLocal这个东西的呢?

8. DispatcherServlet

Spring是通过DispatcherServlet ->FrameworkServlet->HttpServletBean->HttpServlet->GenericServlet->Servlet,最终实现了Servlet接口,DispatcherServlet又叫前置控制器。DispatcherServlet的主要工作流程如下:

  1. 前端请求到达DispatcherServlet。
  2. 前端控制器请求HandlerMappering 查找Handler。
  3. 如果查找到存在的处理器,进一步去调用service和dao层
  4. 返回结果再到controller层,渲染具体的视图,返回结果给页面。

9. Synchronized

类方法中synchronized锁住的是对象this,只有调用同一个对象的方法才需要获取锁。
静态方法中synchronized锁住的是类,该类中所有加了synchronized的静态方法,一次只能调用一个。
这里必须强调的是:当一个对象被创建时候,JVM会为这个对象创建一个自引用的指针this,所以this只能在类的非静态方法中使用,this和对象之间是一一对应关系,不是和类一一对应,这个需要特别注意的点。同一个类的不同实例(对象)this不是一个东西。

10. JVM锁优化

image.png

对象锁的状态分为四种: 无锁,轻量级锁,重量级锁和偏向锁。偏向锁是JDK1.6提出来的一种锁优化的机制,默认是开启的。这么多锁的目的是为了尽可能提高锁的性能,降低锁带来的系统性能损耗。http://blog.csdn.net/zhxdick/article/details/61916359

11. Java Reference

Java的引用分四个级别:强,软(SoftReference),弱(WeakReference),虚(PhantomReference);
强引用就是普通引用,A a1=new A(); A a2 = a1; 当所有A的引用a1, a2都失效之后,new出来的A()对象才能被回收。如果对象的内存大小超出之后,直接报“java.lang.OutOfMemoryError”。
软引用用来描述还有用并非必要的对象,在系统将要发生内存溢出异常之前,将会把这些对象列入回收范围进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。
弱引用也是用来描述非必要对象的,但是他的强度比软引用更弱一些,被软引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获取一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,726评论 6 342
  • 有点懒得把图片传上来了,请移步这里看 Cocos官方论坛-wiki CocoaChina论坛帖子 上面两个是一样的...
    椒盐老蛏阅读 5,195评论 1 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,590评论 18 139
  • Java技术版图-awesome-java aewsome-java是github上一个开源项目,搜集Java各领...
    静默虚空阅读 4,284评论 0 44
  • 最近一段时间感情波动较大,不应该处于这种状态了,要适当的改变一下自我!让自己的状态走入正轨中,每个细节都会影响到自...
    OO碰到OO阅读 128评论 1 0