- 博客(100)
- 资源 (1)
- 收藏
- 关注
原创 【18】逃逸分析
若证明某些新建的对象不逃逸,JVM可以将其分配至栈上,并且在 new 语句所在的方法退出时,通过弹出当前方法的栈桢来自动回收所分配的内存空间。对上述代码标量替换后,由于Itr对象没有被实际分配,因此和栈上分配一样,它同样可以减轻垃圾回收的压力。JVM对象都是在堆上分配的,堆上的内容对任何线程可见,JVM需要对所分配的堆内存进行管理。标量替换这项优化技术,可以看成将原本对对象的字段的访问,替换为一个个局部变量的访问。即时编译器可以根据逃逸分析的结果进行诸如锁消除、栈上分配以及标量替换的优化。
2024-08-25 20:39:08
362
原创 【17】HotSopt虚拟机的intrinsic
intrinsic的方法除了原本较为低效的JDK方法以外,还会额外维护一套高效实现。但不同版本的虚拟机所实现的intrinsic(即若当前版本的JVM刚好实现了这个intrinsic方法,则使用高效方法,否则会降级为抵消的JDK版本)不少标记为intrinsic的方法都是native方法,原本对这些native方法的调用需要经过JNI(Java native interface),性能开销巨大,经过即时编译器的intrinsic优化,这部分JNI开销将消失不见。在Hotspot虚拟机中,所有被注解。
2024-08-22 23:25:43
496
1
原创 【16】方法内联
C2中,方法内联是在解析字节码的过程中完成的。每当碰到方法调用字节码时,C2将决定是否需要内联该方法调用。若需要内联,则解析目标方法的字节码。方法内联:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。内联越多,生成的机器码越长,可能导致code cache已满,导致即时编译被关闭。,即转换为一个或多个直接调用,然后才能进行方法内联。动态方法调用:即时编译器需要先对虚方法调用进行。内联越多,编译时间越长(对即时编译器来说)。内联越多,生成代码的执行效率越高;
2024-08-22 23:23:59
320
原创 【14】即时编译器的中间表达形式
更确切的说,是一张包含控制流和数据流的 IR 图,每个字节码对应其中的若干个节点(注意,有些字节码并没有对应的 IR 节点)。我们可以将每一种优化看成一个独立的图算法,它接收一个 IR 图,并输出经过转换后的 IR 图。HotSpot里的C2采用的是名为 Sea-of-nodes的SSA IR。它最大的特点是去除了变量的概念,直接采用变量所指向的值来进行运算。JIT不需要重新进行词法、语法、语义分析,而是直接将Java字节码当做IR。这种IR的特点是每个变量只能被赋值一次,且只有在被赋值以后才能使用。
2024-08-21 22:39:33
379
原创 【13】即时编译(JIT)
当方法被 3 层 C1 所编译时,生成的 C1 代码将收集条件跳转指令的分支 profile,以及类型相关指令的类型 profile。在假设失败的情况下,Java 虚拟机将采取去优化,退回至解释执行并重新收集相关的 profile。当方法的调用次数和循环回边的次数的和超过-XX:CompileThreshold,便会触发JIT(使用C1时,该值为1500,使用C2时,该值为10000)代码会先在JVM上解释执行,之后反复执行的热点代码会被即时翻译成为机器码,直接运行在底层硬件上。阈值大小是动态调整的。
2024-08-18 23:24:08
792
原创 【11】Java虚拟机是怎么实现synchronized的?
当声明synchronized当声明 synchronized 代码块时,编译而成的字节码将包含monitorenter指令和monitorexit指令,二者是一对多的关系(JVM需要保证所获得的锁在正常执行路径以及异常执行路径上都能够被解锁)
2024-08-18 21:40:48
549
原创 【10】Java内存模型
如果操作X happens-before 操作Y,那么X的结果对于Y可见。没有标记为volatile,在同一线程中,A1和A2存在happens-before关系,但没有数据依赖,因此可以重排序。对于即时编译器来说,会针对每个happens-before关系,向正在编译的目标方法中插入相应的内存屏障。在同一个线程中,字节码的先后顺序(program order)也暗含了happens-before关系。操作X happens-before 操作Y,使得操作X之前的字节码结果对操作Y之后的字节码可见。
2024-08-18 21:39:24
640
原创 【07】JVM是怎么实现invokedynamic的
invokedynamic 是 Java 7 引入的一条新指令,用以支持动态语言的方法调用。具体来说,它将调用点(CallSite)抽象成一个 Java 类,并且将原本由 Java 虚拟机控制的方法调用以及方法链接暴露给了应用程序。在运行过程中,每一条 invokedynamic 指令将捆绑一个调用点,并且会调用该调用点所链接的方法句柄。
2024-08-10 21:47:46
792
原创 【06】JVM是如何实现反射的?
为了保证框架的可扩展性,往往借助 Java 的反射机制,根据配置文件来加载不同的类。Spring 框架的依赖反转(IoC),便是依赖于反射机制。
2024-08-10 21:43:29
395
原创 【05】JVM是如何处理异常的
这个操作会逐一访问当前线程的栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名、文件名,以及在代码中的第几行触发该异常等信息。当程序触发异常时,Java虚拟机会遍历异常表中的所有条目。当触发异常的字节码的索引值在异常条目的监控范围内,JVM会判断所抛出的异常和该条目想要捕获的异常是否匹配。这个事情是由编译器来实现的,现在的做法是这样的,编译器在编译Java代码时,会复制finally代码块的内容,然后分别放在try-catch代码块所有的正常执行路径及异常执行路径的出口中。
2024-08-03 23:38:14
448
原创 【04】JVM是如何执行方法调用的
方法表中有两个特点:1.子类方法表中包含父类方法表中的所有方法 2.子类方法在方法表中的索引值,与它所重写的父类方法的索引值相同。内联缓存,缓存虚方法调用中调用者的动态类型,以及该类型所对应的目标方法。Java虚拟机中的静态绑定指的是在解析时能够直接识别目标方法的情况,动态绑定指的是在运行过程中根据调用者的动态类型来识别目标方法的情况。2.invokespecial:用于调用私有实例方法、构造器以及使用super关键字调用父类的实例方法或构造器,和所实现接口的默认方法。举个例子说明下上面这句话。
2024-08-03 23:36:29
520
原创 【Guava】Guava EventBus & JDK Observer模式
对于事件监听和发布订阅模式,使用guava eventbus可以省去开发人员很多事情,不同于JDK自带的Observer模式,不用在去定义那些复杂的类或接口来实现事件发布与订阅,Guava的EventBus 只需要关注事件类型及监听类的对应开发工作既可以。EventBus会向所有订阅发布者事件的订阅者进行事件的发送(post)被监听者:发送变更事件给监听者,使监听者监听到变更事件后,完成动作变更。EventBus = Event(事件) + Bus(总线)监听者:监听来自被监听者的变更事件,完成动作变更。
2024-06-29 11:26:48
284
原创 OLAP-联机分析处理
联机分析处理OLAP是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的数据仓库与OLAP的关系是互补的,现代OLAP系统一般以数据仓库作为基础,即从数据仓库中抽取详细数据的一个子集并经过必要的聚集存储到OLAP存储器中供前端分析工具读取。
2024-06-15 23:33:29
730
原创 Maven相关知识
exclusions:考虑这样一种情况,我们的projectA依赖于projectB,然后projectB又依赖于projectC,但是在projectA里面我们不需要projectB依赖的projectC,那么这个时候我们就可以在依赖projectB的时候使用exclusions元素下面的exclusion排除projectC。这种类型的依赖性是不可传递的。compile:这是它的默认值,这种类型很容易让人产生误解,以为只有在编译的时候才是需要的,其实这种类型表示所有的情况都是有用的,包括编译和运行时。
2024-06-15 23:24:02
1189
原创 、【Guava】EventBus 源码解析
EventBus 采用发布订阅者模式的实现方式,它实现了泛化的注册方法以及泛化的方法调用,另外还考虑到了多线程的问题,对多线程使用时做了一些优化,观察者模式都比较熟悉,这里会简单介绍一下,重点介绍的是如何泛化的进行方法的注册以及调用,还有在单个线程和多线程不同的实现方式。#发布订阅者模式Guva中EventBus的机制就是观察者模式,因此符合观察者模式的一般结构:监听者:监听来自被监听者的变更事件,完成动作变更被监听者:发送变更事件给监听者,使监听者监听到变更事件后,完成动作变更。
2024-06-15 23:13:15
1336
2
原创 【Guava】常用操作
则后续代码可以通过isPresent()来判断是否返回了期望的值(原本期望返回null或者返回不为null,其意义不清晰),并且可以使用get()来获得实际的返回值。Google的官方文档中说,它是用来避免使用null的,而且Google的code base中大约95%的collection中不该含有null值。Optional的最常用价值在于,例如,假设一个方法返回某一个数据类型,调用这个方法的代码来根据这个方法的返回值来做下一步的动作,监听者:监听来自被监听者的变更事件,完成动作变更。
2024-06-15 23:12:29
782
原创 【Guava】ImmutableList使用问题分析
今天用到ImmutableList的时候,在使用ImmutableList的过程中发现针对于使用场景: public ImmutableList validatePredicates = ImmutableList.of( new BmZJGroupService() );其中BmZJGroupService 是 BmAbstractGro
2016-10-25 22:43:38
4311
1
转载 关于nest exception
问题:使用spring经常会遇到类似的问题 error create bean name xxx failed nest exception class not found... 想知道是由于前面创建的错误导致后边的异常,还是后边的异常导致前面的创建错误,nest exception(嵌套异常)的真正含义是什么?回答:重新贴一下 格式化的, 1、伪代码代
2016-09-24 16:25:44
4011
转载 过滤器与拦截器
过滤器(filter),过滤器处于客户端与Web资源(Servlet、JSP、HTML)之间,客户端与Web资源之间的请求和响应都要通过过滤器进行过滤。举例:在过滤器中定义了禁止访问192.10.10.1这个地址,那么当客户端发出访问192.10.10.1的请求时,经过过滤器后,客户端得到的响应是出现该IP禁止访问的提示。在java web中,你传入的request,response提前过滤掉一些
2016-09-21 22:33:31
419
转载 Intellij idea下的maven web工程
新建新建maven项目,create from archetype,选择maven-archetype-webappNext,填写GroupId,ArtifactId和VersionNext,这里在Properties中添加一个参数archetypeCatalog=internal,不加这个参数,在maven生成骨架的时候将会非常慢,有时候会直接卡住。
2016-09-11 00:10:13
557
转载 对象引用前加const报错:不能将“this”指针从“const a”转换为“a
#include "stdafx.h"#include using namespace std;class a{ int i;public: a(int j):i(j) {} void show() { cout<<"i="<<i<<endl; }}; void test(const a &aa){
2015-07-05 22:21:09
714
原创 effective c++ 记录之对象切割问题
今天看effective c++ 发现里面有句话不太理解"造成此对象的行为像个derived class对象"的那些特化性质全被切割掉了,仅仅留下一个base class对象"总感觉这话听起来特别拗口,于是在程序里面大致实现了下 window:父类window_son:子类代码如下:window.h#pragma once#include #include #
2015-06-29 00:06:58
627
原创 关于建树以及建单链表时要使用二重指针的原因
今天终于打算来处理下这个问题了,至于为什么有的时候形参要使用二重指针,尤其是在建树以及建立单链表的时候。 我们知道,在建立树节点以及建立链表的节点的时候,一般的教材里面是这样写 (Node *)malloc(sizeof(Node)) 这里我认为就是为什么要使用二重指针的原因int BTreeCreate(BTree **tp){ //构造方法,或者说构造顺序:从左子树开始构造
2015-03-25 21:57:43
1571
原创 关于js的CreateTextFile和OpenTextFile
这两天忙着做一个简单的静态网页,用到了JS的文件操作CreateTextFile 和OpenTextFile应该是属于同一等级的函数,不要以为应该是先CreateTextFile以后就应该调用OpenTextFile,并不是这样的完全可以通过OpenTextFile中的第三个属性(true)来新建一个文件并写入。二者都可以创建指定的文件名并返回一个 TextStream 对象,可以
2015-01-24 22:01:19
4541
原创 未定义基类的问题
今天在写代码的时候 发现遇到一个 未定义基类的问题,郁闷了好久,通过查资料发现原来是在OgreApp1.h的头文件中 include 了自己写的一个控制器类 #include “UnitManager.h”,而只有UnitManager这个类重载BaseApplication的几个虚函数才能达到控制器的作用,而且OgreApp1这个类也是继承了BaseApplication这个类,所以我又
2015-01-15 22:14:08
6133
原创 来自知乎:关于while(cin>>string)的输出结果
string line;cin>>line;cout输入hello world 就会输出 hello如果写成while(cin >> line)cout一样的输入,就会输出 helloworld注意:空格是cin的分隔符 std::string是一种容器,在第二种方式中,每次循环更新一次这个容器在第二种方式中,每次while都只是把一个空格前的一个写入输出流。
2014-12-28 11:49:52
844
原创 又是一个链接库的问题
今天又碰到一个链接库的问题。。写了一个自己的链接库,然后需要在另一个程序中调用,在使用的时候总是提示:导致LIBCMTD.lib 和 MSVCRD.lib造成冲突一顿百度一个Debug版的dll链接时,VS会首先链接QT的Debug库,比如QtCoreD.dll,而QtCoreD.dll内部又一定链接了VC的Debug库,比如msvcrD.dll,自己写的dll
2014-12-27 17:44:19
478
原创 关于句柄类与重载操作符
好久没写文章了,重新开始吧。。这次看c++ primer的过程遇到一个句柄类的问题,感觉值得编写代码测试一下,想到之前一直对MFC中句柄概念不太熟悉,所以决定自己写一个句柄类实现一下。通过一下午对句柄类的研究,我个人感觉,句柄类其实就是对各种类的封装,同时又作为一个桥梁将父类与子类进行动态绑定。而且通过句柄类,你可以将你的父类,子类中不想要用户使用的变量或者函数置为private的,然
2014-12-26 20:53:58
535
转载 神经网络训练样本和测试样本的区别
训练样本是用来训练学习机的,测试样本是学习机要识别的对象。比如你想让一台电脑能识别茶杯,首先你要准备一个茶杯(训练样本),然后把茶杯给计算机看(数据输入),并告诉电脑说这样的东东是茶杯(期望输出),电脑看到茶杯后它认为是花盆,但看到你的期望是茶杯,他就不停训练自己这个是茶杯不是花盆,直到电脑他自己认为茶杯是茶杯后结束(这个过程叫学习),然后你把另一只茶杯(测试样本)放在电脑面前,并问他这是什么东东
2014-05-11 15:52:44
13497
原创 关于C++的static
今天打算在一个项目里面写个自己的类,结果发觉C++的类忘记了很多(看来不能总是跟java打交道,不然很容易把C++跟java的类)
2014-04-10 10:46:44
608
原创 收获的一天
今天拿到一个软件源码,需要配置环境,配了一上午,基本上是完成了,但是总是出现一些系统找不到指定路径的错误,因为考虑到项目有用到QT,于是按照http://www.cnblogs.com/rockhawk/archive/2010/12/15/1906956.html将vs2010配置好。发现还是出现 系统找不到指定路径 的错误。于是就去看每一个项目,发现其附加依赖项什么的关于路径的全部
2014-03-17 20:16:48
470
转载 android listview继承BaseAdapter,自定义的适配器,getView方法执行多组循环解决方式
1.如果Activity继承ListActivity,不自定义布局文件,直接使用android默认的ListView布局文件.不会出现getView()方法执行多组循环. android默认的ListView布局文件如下: android:layout_width="fill_parent" android:layout_height="fill_parent" /
2014-03-16 19:08:16
798
转载 关于android的好的博客栏目(持续更新。。。)
http://www.cnblogs.com/zhangdongzi/category/280527.html
2014-03-14 16:30:17
442
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人