零碎笔记(七)
来源:互联网 发布:淘宝网皮衣女装 编辑:程序博客网 时间:2024/05/17 03:50
web.xml中classpath和classpath*的区别:
classpath:只会到指定的class路径中查找文件;
classpath*:不仅在指定的class路径中查找文件,还包括在jar文件中(class路径)进行查找.
java.util.LinkedList是双向链表,理论上说,双向链表的删除的时间复杂度是O(1),但实际上LinkedList.remove(Object)方法的时间复杂度是O(n)+O(1),结果仍然是O(n)的时间复杂度,因为需要O(n)的复杂度去定位删除节点。
使用与运算代替求余运算:当需要对2的次幂进行求余时,可以是使用&运算符来代替,提升效率。当x=2^n(n为自然数)时,a % x = a & (x - 1 )。
正常情况下数据从文件发送到socket的过程:
1. 操作系统从磁盘读取数据到系统内核空间的缓存页中;
2. 应用从内核空间读取数据到用户空间缓冲区中;
3. 应用从把数据写回到内核空间的socket缓冲区中;
4. 系统拷贝socket缓冲区的数据到网卡缓冲区, 然后由网卡发送数据到网络中。
有4次拷贝还有2次系统调用, 如果使用sendfile命令, 重新拷贝运行系统直接把数据从缓存页拷贝到网络, 优化后, 最终只需要一次从缓存页到网卡缓冲区拷贝。
Java8的实现lambda表达式时,使用Java7加入的一个新指令invokeDynamic去动态地连接lambda函数的真正调用点,从而代替创建一个用于包装lambda函数的对象。
不可变对象的好处:
不可变对象对GC的优化,主要体现在Old Generation中。
如果存在Old Generation的对象引用了Young Generation的对象,那么在每次YoungGC的过程中,就必须考虑到这种情况。Hotspot JVM为了提高YoungGC的性能,避免每次YoungGC都扫描Old Generation中的对象引用,采用了 卡表(Card Table) 的方式。简单来说,当Old Generation中的对象发生对Young Generation中的对象产生新的引用关系或释放引用时,都会在卡表中响应的标记上标记为脏(dirty),而YoungGC时,只需要扫描这些dirty的项就可以了。
可变对象对其它对象的引用关系可能会频繁变化,并且有可能在运行过程中持有越来越多的引用,特别是容器。这些都会导致对应的卡表项被频繁标记为dirty。而不可变对象的引用关系非常稳定,在扫描卡表时就不会扫到它们对应的项了。
这里的不可变对象,不是指仅仅自身引用不可变的final对象,而是真正的Immutable Objects。
在程序运行时类是在方法区,实例对象本身在堆里面。
方法字节码在方法区。线程调用方法执行时创建栈帧并压栈,方法的参数和局部变量在栈帧的局部变量表。
对象的实例变量和对象一起在堆里,所以各个线程都可以共享访问对象的实例变量。
静态变量在方法区,所有对象共享。字符串常量等常量在运行时常量池。
各线程调用的方法所有参数传递、方法返回值的返回,都是使用栈帧里的操作数栈来完成的。
-verbose:gc与-XX:+PrintGCDetails:
经常能看到在推荐的标准参数里这两个参数一起出现。实际上它们有啥关系?
在Oracle/Sun JDK 6里,"java"这个启动程序遇到"-verbosegc"会将其转换为"-verbose:gc",将启动参数传给HotSpot VM后,HotSpot VM遇到"-verbose:gc"则会当作"-XX:+PrintGC"来处理。 也就是说 -verbosegc、-verbose:gc、-XX:+PrintGC 三者的作用是完全一样的。
而当HotSpot VM遇到-XX:+PrintGCDetails参数时,会顺带把-XX:+PrintGC给设置上。也就是说-XX:+PrintGCDetails包含-XX:+PrintGC,进而也就包含 -verbose:gc。
在使用G1 GC策略时,Humongous对象的分配会极大伤害G1的性能,使用命令行选项 -XX:+TraceG1HObjAllocation,在标准输出打印大对象的分配堆栈。用户可以根据这些Trace信息,在应用层面减少大对象的分配,提升G1使用的性能。
classpath:只会到指定的class路径中查找文件;
classpath*:不仅在指定的class路径中查找文件,还包括在jar文件中(class路径)进行查找.
java.util.LinkedList是双向链表,理论上说,双向链表的删除的时间复杂度是O(1),但实际上LinkedList.remove(Object)方法的时间复杂度是O(n)+O(1),结果仍然是O(n)的时间复杂度,因为需要O(n)的复杂度去定位删除节点。
使用与运算代替求余运算:当需要对2的次幂进行求余时,可以是使用&运算符来代替,提升效率。当x=2^n(n为自然数)时,a % x = a & (x - 1 )。
正常情况下数据从文件发送到socket的过程:
1. 操作系统从磁盘读取数据到系统内核空间的缓存页中;
2. 应用从内核空间读取数据到用户空间缓冲区中;
3. 应用从把数据写回到内核空间的socket缓冲区中;
4. 系统拷贝socket缓冲区的数据到网卡缓冲区, 然后由网卡发送数据到网络中。
有4次拷贝还有2次系统调用, 如果使用sendfile命令, 重新拷贝运行系统直接把数据从缓存页拷贝到网络, 优化后, 最终只需要一次从缓存页到网卡缓冲区拷贝。
Java8的实现lambda表达式时,使用Java7加入的一个新指令invokeDynamic去动态地连接lambda函数的真正调用点,从而代替创建一个用于包装lambda函数的对象。
不可变对象的好处:
不可变对象对GC的优化,主要体现在Old Generation中。
如果存在Old Generation的对象引用了Young Generation的对象,那么在每次YoungGC的过程中,就必须考虑到这种情况。Hotspot JVM为了提高YoungGC的性能,避免每次YoungGC都扫描Old Generation中的对象引用,采用了 卡表(Card Table) 的方式。简单来说,当Old Generation中的对象发生对Young Generation中的对象产生新的引用关系或释放引用时,都会在卡表中响应的标记上标记为脏(dirty),而YoungGC时,只需要扫描这些dirty的项就可以了。
可变对象对其它对象的引用关系可能会频繁变化,并且有可能在运行过程中持有越来越多的引用,特别是容器。这些都会导致对应的卡表项被频繁标记为dirty。而不可变对象的引用关系非常稳定,在扫描卡表时就不会扫到它们对应的项了。
这里的不可变对象,不是指仅仅自身引用不可变的final对象,而是真正的Immutable Objects。
在程序运行时类是在方法区,实例对象本身在堆里面。
方法字节码在方法区。线程调用方法执行时创建栈帧并压栈,方法的参数和局部变量在栈帧的局部变量表。
对象的实例变量和对象一起在堆里,所以各个线程都可以共享访问对象的实例变量。
静态变量在方法区,所有对象共享。字符串常量等常量在运行时常量池。
各线程调用的方法所有参数传递、方法返回值的返回,都是使用栈帧里的操作数栈来完成的。
-verbose:gc与-XX:+PrintGCDetails:
经常能看到在推荐的标准参数里这两个参数一起出现。实际上它们有啥关系?
在Oracle/Sun JDK 6里,"java"这个启动程序遇到"-verbosegc"会将其转换为"-verbose:gc",将启动参数传给HotSpot VM后,HotSpot VM遇到"-verbose:gc"则会当作"-XX:+PrintGC"来处理。 也就是说 -verbosegc、-verbose:gc、-XX:+PrintGC 三者的作用是完全一样的。
而当HotSpot VM遇到-XX:+PrintGCDetails参数时,会顺带把-XX:+PrintGC给设置上。也就是说-XX:+PrintGCDetails包含-XX:+PrintGC,进而也就包含 -verbose:gc。
在使用G1 GC策略时,Humongous对象的分配会极大伤害G1的性能,使用命令行选项 -XX:+TraceG1HObjAllocation,在标准输出打印大对象的分配堆栈。用户可以根据这些Trace信息,在应用层面减少大对象的分配,提升G1使用的性能。
0 0
- 零碎笔记(七)
- 零碎笔记(一)
- 零碎笔记(二)
- 零碎笔记(三)
- 零碎笔记(四)
- 零碎笔记(五)
- 零碎笔记(六)
- Hibernate3 零碎笔记(二)
- javascript零碎笔记(基础)
- javascript零碎笔记(高级)
- python学习笔记(零碎)
- 工作笔记(零碎知识点)
- 零碎笔记
- 零碎笔记
- 零碎笔记
- 零碎笔记
- 零碎笔记
- 零碎笔记
- 【caffe-Windows】添加工程-以classification为例
- poj2533-Longest Ordered Subsequence(最长上升子序列)
- shell 开始日期 结束日期循环
- 我的java学习之路-基础知识
- 简单的定义基类
- 零碎笔记(七)
- 计算机视觉(一)——数据增广
- java判断素数
- gdb学习记录
- (Shadow,Gradient)
- Linux学习之第十章
- android应用的ACTIVITY当使用EditText控件时会默认弹出输入法窗口,默认不弹出窗口方法
- 快速排序算法详解
- 蓝桥杯JAVA言语B组_切面条