1. Object对象有哪些方法:
toString: 返回ClassName+@+hashcode;
hashcode: 返回内存地址的整数形式.
equals: 对比2个引用是否相等.
clone();
wait();
notify();
notifyAll();
finalize();
2. java 堆的了解:
java内存是分为java堆和java栈.
Java 堆是虚拟机管理的内存中最大的一块. 此内存的唯一目的就是存放对象实例. 从内存回收的角度, 由于现在采用的收集器是分代收集算法, java堆可以分成 新生代和老年代. 新生代可以分成Eden, from survivor, to survivor空间等. 如果从内存分配的角度看, 线程共享的java堆中可能划分出多个线程私有的分配缓冲区空间(TLAB). 进一步的划分为了更好的回收内存, 更快的分配内存.
java堆可以处于物理上不连续的内存空间中, 只要逻辑上是连续的即可. 如果在堆中没有内存完成实例分配, 并且堆也没有办法再扩展, 就会抛出outOfMemoryError的异常.
ThreadLocal的了解:
不是一个线程的本地实现版本, 它不是一个线程, 而是线程局部变量, 为每一个使用该变量的线程提供一个变量值的副本, 是java中一种较为特殊的线程绑定机制, 是每一个线程可以独立改变自己的副本, 而不会和其他线程的副本冲突.
同步机制采用"以时间换空间"的方式, 而threadLocal采用了以空间换时间的方式.前程提供一份变量, 让不同的线程排队访问, 而后者为每一个线程提供一份变量, 因此可以同时访问互不影响.
主要API:
T get(): 返回此线程局部变量的当前线程副本中的值, 如果是线程第一次调用该方法, 则创建并初始化此副本.
void set(T value): 将此线程局部变量的当前线程副本中的值设置为指定值.
ThreadLocal.set(T value) 方法中, 得到当前线程thread t, 然后可以属于该线程的threadLocalMap, 然后使用ThreadLocal的hashcode作为索引值, 把value放入threadLocalMap的table[] 数组中.
(个人理解,望指正:为什么需要threadLocal实例? 比如2个工程, 如果没有threadLocal的实例, 因为Thread.currentThread是jvm系统方法,得到的是当前线程的引用, 用当前线程的hashcode去作为键值, 可能就一个工程覆盖另一个工程, 如果2个工程各有各的threadLocal, 用这个threadLocal的hash作为map里table的索引,那就能区分出各个工程所要保存的值.)
mysql优化:
方法主要有优化查询, 优化数据库结构, 优化mysql服务器.
优化查询可以通过建立索引来加速. 如果使用了索引,查询语句只会查询索引字段。这样就减少查询的记录数,达到提高查询效率的目的。
索引举例: CREATE INDEX index_name ON student(name);
优化数据库结构有几种方法. 1将字段很多的表分成多个表. 2增加中间表 3增加冗余字段 4优化插入记录的速度, 可以一次插入多条记录, 而不是多次插入insert语句. 在增加前不实用索引, 插入后再使用索引.
优化mysql服务器: MySQL参数的优化:内存中会为MySQL保留部分的缓冲区。这些缓冲区可以提高MySQL的速度。缓冲区的大小都是在MySQL的配置文件中进行设置的。
- key_buffer_size:表示索引缓存的大小。这个值越大,使用索引进行查询的速度就越快
- table_cache:表示同时打开的表的个数。这个值越大,能同时打开的表的个数就越多。这个值不是越大越好,因为同时打开的表过多会影响操作系统的性能。
- query_cache_size:表示查询缓冲区的大小。使用查询缓存区可以提高查询的速度。这个方式只使用与修改操作少且经常执行相同的查询操作的情况;默认值是0.
- Query_cache_type:表示查询缓存区的开启状态。0表示关闭,1表示开启。
- Max_connections:表示数据库的最大连接数。这个连接数不是越大越好,因为连接会浪费内存的资源。