- 基本数据类型是值传递,引用数据类型是地址
String类型用final修饰,虽然它是引用传递,但是它不可以被修改,所以String处理时,其实是新创建了一个对象;
public class StringTest {
public static void main(String[] args) {
String s="origin";
ChangeClass changeClass = new StringTest().new ChangeClass();
changeClass.change(s);
System.out.println(s);
}
class ChangeClass {
public ChangeClass() {
super();
}
public void change(String s){
s=s+"update";
}
}
}
origin
- 垃圾回收
GC 是垃圾回收器的简称,全称是Garbage Collection。Java 的垃圾回收器并不是特指一种,Java官方本身就提供了很多个GC回收器供用户选择,还有各个Java虚拟机厂商(例如 Azul 的PCG、C4)也自己设计开发了很多优秀的垃圾回收器。
Stop The World 也是一个很重要的关键词,它会在任何一种GC算法中发生,其实可以把它理解为JVM GC在清理内存时,整个程序的停顿时间。当 Stop The World 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到 GC 任务完成。每一代的Java垃圾回收器,都把缩减 Stop The World 停顿时间作为很重要的目标。
JVM GC只回收堆区和方法区内的基本类型数据和对象。
Java性能优化之JVM GC(垃圾回收机制) - 知乎 (zhihu.com)
栈区的数据(仅指基本类型数据),在超出作用域后会自动出栈释放掉,所以其不在JVM GC的管理范围内。
怎么判断对象可以被回收了?
简单来说就是:对象没有引用了或者对象不可达
怎么判断对象是否存活?常见的有两种算法,分别是 引用计数法 和 可达性分析法
引用计数法
在对象中添加引用的计数器,当被引用家+1,引用失效就-1,当回收时,计数器为0则进行回收;但是它不能回收相互引用的对象,所以主流的java虚拟机都没有用这种
可达性分析法(根搜索算法)
其实不止是Java,C# 也是使用可达性分析算法来判断对象是否存活的,这个算法也可以称之为根搜索算法。
Java目前在用的主流虚拟机,都是采用可达性分析法来判断对象是否可被回收的,它通过若干个根节点组成的集合(GC Roots),向下遍历搜索,遍历的过程就是一条引用链,没有在这个链条上面的对象,是不可能被再次使用的,可以判定为可回收的对象。
标记 - 清除算法
标记 - 复制算法
- 线程安全问题
package com.chenlei.day001;
public class SystemTest {
public static void main(String[] args) {
SellTicket st = new SellTicket();
new Thread(st, "窗口1").start();
new Thread(st, "窗口2").start();
new Thread(st, "窗口3").start();
}
}
class SellTicket implements Runnable {
private int count = 100;
@Override
public void run() {
String name = Thread.currentThread().getName();
while (count > 0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "卖出了1张票,还剩余" + (--count) + "张票");
}
}
}
用同一个runable对象创建的线程对象之间可以共享变量count;
但是容易出现线程安全问题,此时我们则可以用锁来锁住对象,或者方法或者代码段,尽量减小锁的粒度,如果锁打的粒度比较大,判断锁和等待锁释放的时间会比较长,反而降低程序运行效率
Day02
- mysql中创建枚举类字段时,枚举值不能是中文。否则报错;
2.mybatis连接数据库时,两个配置文件,加载时,我们是加载核心配置文件,不是映射文件,不然解析时; 找了半天这个问题,进入到源码里面debug,发现environment和properties两个参数都为空,但是我环境又配置了的,都快崩溃了,后来发现自己文件写错了,把自己都逗笑了,真的是太粗心了!!!!!!!!
3.mybatis在映射时有提供类型映射处理器,在重写方法后,记得在核心配置文件中(一定加在最上面,加在environment后面时会报红),添加typehandler,让其注册,最好是映射resultmap中,添加到具体的字段上;
突然想到之前写mapper文件时,遇到过写查询结果映射,用resulttype自动匹配,因为前后台实体没有同步,导致传到前台的数据,属性的值混乱,一方面是要同步前后台实体,另一个方面最好用resultmap强制绑定列和字段,而且resulttype底层会用反射出来的method会按照驼峰命名,如果属性名取名不是很合理的话,会很容易匹配不上(具体不研究了,反正用resultmap就对了);