自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 资源 (1)
  • 收藏
  • 关注

原创 【19】循环优化

为了提升循环的效率,编译器会针对循环的编译进行多种方式的优化,比如:循环无关代码外提,循环展开等。

2024-08-29 00:06:30 361 1

原创 【18】逃逸分析

若证明某些新建的对象不逃逸,JVM可以将其分配至栈上,并且在 new 语句所在的方法退出时,通过弹出当前方法的栈桢来自动回收所分配的内存空间。对上述代码标量替换后,由于Itr对象没有被实际分配,因此和栈上分配一样,它同样可以减轻垃圾回收的压力。JVM对象都是在堆上分配的,堆上的内容对任何线程可见,JVM需要对所分配的堆内存进行管理。标量替换这项优化技术,可以看成将原本对对象的字段的访问,替换为一个个局部变量的访问。即时编译器可以根据逃逸分析的结果进行诸如锁消除、栈上分配以及标量替换的优化。

2024-08-25 20:39:08 306

原创 【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 432

原创 【16】方法内联

C2中,方法内联是在解析字节码的过程中完成的。每当碰到方法调用字节码时,C2将决定是否需要内联该方法调用。若需要内联,则解析目标方法的字节码。方法内联:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。内联越多,生成的机器码越长,可能导致code cache已满,导致即时编译被关闭。,即转换为一个或多个直接调用,然后才能进行方法内联。动态方法调用:即时编译器需要先对虚方法调用进行。内联越多,编译时间越长(对即时编译器来说)。内联越多,生成代码的执行效率越高;

2024-08-22 23:23:59 264

原创 【15】Java字节码

Java方法栈帧的组成:操作数栈+局部变量表。

2024-08-21 23:36:20 898

原创 【14】即时编译器的中间表达形式

更确切的说,是一张包含控制流和数据流的 IR 图,每个字节码对应其中的若干个节点(注意,有些字节码并没有对应的 IR 节点)。我们可以将每一种优化看成一个独立的图算法,它接收一个 IR 图,并输出经过转换后的 IR 图。HotSpot里的C2采用的是名为 Sea-of-nodes的SSA IR。它最大的特点是去除了变量的概念,直接采用变量所指向的值来进行运算。JIT不需要重新进行词法、语法、语义分析,而是直接将Java字节码当做IR。这种IR的特点是每个变量只能被赋值一次,且只有在被赋值以后才能使用。

2024-08-21 22:39:33 345

原创 【13】即时编译(JIT)

当方法被 3 层 C1 所编译时,生成的 C1 代码将收集条件跳转指令的分支 profile,以及类型相关指令的类型 profile。在假设失败的情况下,Java 虚拟机将采取去优化,退回至解释执行并重新收集相关的 profile。当方法的调用次数和循环回边的次数的和超过-XX:CompileThreshold,便会触发JIT(使用C1时,该值为1500,使用C2时,该值为10000)代码会先在JVM上解释执行,之后反复执行的热点代码会被即时翻译成为机器码,直接运行在底层硬件上。阈值大小是动态调整的。

2024-08-18 23:24:08 703

原创 【11】Java虚拟机是怎么实现synchronized的?

当声明synchronized当声明 synchronized 代码块时,编译而成的字节码将包含monitorenter指令和monitorexit指令,二者是一对多的关系(JVM需要保证所获得的锁在正常执行路径以及异常执行路径上都能够被解锁)

2024-08-18 21:40:48 527

原创 【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 609

原创 【09】垃圾回收

Java 虚拟机的语境下,垃圾指的是死亡的对象所占据的堆空间。

2024-08-17 17:00:18 738

原创 【8】Java对象的内存布局

构造函数的调用:构造函数的调用要做为构造器的低一条语句,目的是初始化继承而来的父类字段。

2024-08-17 16:55:53 313

原创 【07】JVM是怎么实现invokedynamic的

invokedynamic 是 Java 7 引入的一条新指令,用以支持动态语言的方法调用。具体来说,它将调用点(CallSite)抽象成一个 Java 类,并且将原本由 Java 虚拟机控制的方法调用以及方法链接暴露给了应用程序。在运行过程中,每一条 invokedynamic 指令将捆绑一个调用点,并且会调用该调用点所链接的方法句柄。

2024-08-10 21:47:46 733

原创 【06】JVM是如何实现反射的?

为了保证框架的可扩展性,往往借助 Java 的反射机制,根据配置文件来加载不同的类。Spring 框架的依赖反转(IoC),便是依赖于反射机制。

2024-08-10 21:43:29 343

原创 【05】JVM是如何处理异常的

这个操作会逐一访问当前线程的栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名、文件名,以及在代码中的第几行触发该异常等信息。当程序触发异常时,Java虚拟机会遍历异常表中的所有条目。当触发异常的字节码的索引值在异常条目的监控范围内,JVM会判断所抛出的异常和该条目想要捕获的异常是否匹配。这个事情是由编译器来实现的,现在的做法是这样的,编译器在编译Java代码时,会复制finally代码块的内容,然后分别放在try-catch代码块所有的正常执行路径及异常执行路径的出口中。

2024-08-03 23:38:14 391

原创 【04】JVM是如何执行方法调用的

方法表中有两个特点:1.子类方法表中包含父类方法表中的所有方法 2.子类方法在方法表中的索引值,与它所重写的父类方法的索引值相同。内联缓存,缓存虚方法调用中调用者的动态类型,以及该类型所对应的目标方法。Java虚拟机中的静态绑定指的是在解析时能够直接识别目标方法的情况,动态绑定指的是在运行过程中根据调用者的动态类型来识别目标方法的情况。2.invokespecial:用于调用私有实例方法、构造器以及使用super关键字调用父类的实例方法或构造器,和所实现接口的默认方法。举个例子说明下上面这句话。

2024-08-03 23:36:29 484

原创 【03】Java虚拟机是如何加载Java类的

从class文件到内存中的类,按先后顺序需要经过加载、链接以及初始化三个步骤。

2024-07-27 23:39:52 583

原创 【02】Java的语言类型

Java语言的类型可以分为两大类:基本类型和引用类型。

2024-07-27 23:36:07 252

原创 【01】Java代码如何运行

JRE: 包含Java虚拟机以及核心类库JDK: 同样包含了JRE,并且附带了一系列开发、诊断工具。

2024-06-29 11:38:33 361

原创 【Guava】Guava EventBus & JDK Observer模式

对于事件监听和发布订阅模式,使用guava eventbus可以省去开发人员很多事情,不同于JDK自带的Observer模式,不用在去定义那些复杂的类或接口来实现事件发布与订阅,Guava的EventBus 只需要关注事件类型及监听类的对应开发工作既可以。EventBus会向所有订阅发布者事件的订阅者进行事件的发送(post)被监听者:发送变更事件给监听者,使监听者监听到变更事件后,完成动作变更。EventBus = Event(事件) + Bus(总线)监听者:监听来自被监听者的变更事件,完成动作变更。

2024-06-29 11:26:48 186

原创 OLAP-联机分析处理

联机分析处理OLAP是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的数据仓库与OLAP的关系是互补的,现代OLAP系统一般以数据仓库作为基础,即从数据仓库中抽取详细数据的一个子集并经过必要的聚集存储到OLAP存储器中供前端分析工具读取。

2024-06-15 23:33:29 687

原创 Maven相关知识

exclusions:考虑这样一种情况,我们的projectA依赖于projectB,然后projectB又依赖于projectC,但是在projectA里面我们不需要projectB依赖的projectC,那么这个时候我们就可以在依赖projectB的时候使用exclusions元素下面的exclusion排除projectC。这种类型的依赖性是不可传递的。compile:这是它的默认值,这种类型很容易让人产生误解,以为只有在编译的时候才是需要的,其实这种类型表示所有的情况都是有用的,包括编译和运行时。

2024-06-15 23:24:02 1115

原创 、【Guava】EventBus 源码解析

EventBus 采用发布订阅者模式的实现方式,它实现了泛化的注册方法以及泛化的方法调用,另外还考虑到了多线程的问题,对多线程使用时做了一些优化,观察者模式都比较熟悉,这里会简单介绍一下,重点介绍的是如何泛化的进行方法的注册以及调用,还有在单个线程和多线程不同的实现方式。#发布订阅者模式Guva中EventBus的机制就是观察者模式,因此符合观察者模式的一般结构:监听者:监听来自被监听者的变更事件,完成动作变更被监听者:发送变更事件给监听者,使监听者监听到变更事件后,完成动作变更。

2024-06-15 23:13:15 1199 2

原创 【Guava】常用操作

则后续代码可以通过isPresent()来判断是否返回了期望的值(原本期望返回null或者返回不为null,其意义不清晰),并且可以使用get()来获得实际的返回值。Google的官方文档中说,它是用来避免使用null的,而且Google的code base中大约95%的collection中不该含有null值。Optional的最常用价值在于,例如,假设一个方法返回某一个数据类型,调用这个方法的代码来根据这个方法的返回值来做下一步的动作,监听者:监听来自被监听者的变更事件,完成动作变更。

2024-06-15 23:12:29 714

原创 【Guava】ImmutableList使用问题分析

今天用到ImmutableList的时候,在使用ImmutableList的过程中发现针对于使用场景: public ImmutableList validatePredicates = ImmutableList.of( new BmZJGroupService() );其中BmZJGroupService 是 BmAbstractGro

2016-10-25 22:43:38 4240 1

转载 关于nest exception

问题:使用spring经常会遇到类似的问题 error create bean name xxx failed nest exception class not found... 想知道是由于前面创建的错误导致后边的异常,还是后边的异常导致前面的创建错误,nest exception(嵌套异常)的真正含义是什么?回答:重新贴一下 格式化的, 1、伪代码代

2016-09-24 16:25:44 3869

转载 过滤器与拦截器

过滤器(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 402

转载 Intellij idea下的maven web工程

新建新建maven项目,create from archetype,选择maven-archetype-webappNext,填写GroupId,ArtifactId和VersionNext,这里在Properties中添加一个参数archetypeCatalog=internal,不加这个参数,在maven生成骨架的时候将会非常慢,有时候会直接卡住。

2016-09-11 00:10:13 532

转载 对象引用前加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 675

原创 effective c++ 记录之对象切割问题

今天看effective c++ 发现里面有句话不太理解"造成此对象的行为像个derived class对象"的那些特化性质全被切割掉了,仅仅留下一个base class对象"总感觉这话听起来特别拗口,于是在程序里面大致实现了下 window:父类window_son:子类代码如下:window.h#pragma once#include #include #

2015-06-29 00:06:58 598

原创 关于建树以及建单链表时要使用二重指针的原因

今天终于打算来处理下这个问题了,至于为什么有的时候形参要使用二重指针,尤其是在建树以及建立单链表的时候。 我们知道,在建立树节点以及建立链表的节点的时候,一般的教材里面是这样写 (Node *)malloc(sizeof(Node)) 这里我认为就是为什么要使用二重指针的原因int BTreeCreate(BTree **tp){ //构造方法,或者说构造顺序:从左子树开始构造

2015-03-25 21:57:43 1545

原创 关于js的CreateTextFile和OpenTextFile

这两天忙着做一个简单的静态网页,用到了JS的文件操作CreateTextFile 和OpenTextFile应该是属于同一等级的函数,不要以为应该是先CreateTextFile以后就应该调用OpenTextFile,并不是这样的完全可以通过OpenTextFile中的第三个属性(true)来新建一个文件并写入。二者都可以创建指定的文件名并返回一个 TextStream 对象,可以

2015-01-24 22:01:19 4483

原创 未定义基类的问题

今天在写代码的时候 发现遇到一个 未定义基类的问题,郁闷了好久,通过查资料发现原来是在OgreApp1.h的头文件中 include 了自己写的一个控制器类 #include “UnitManager.h”,而只有UnitManager这个类重载BaseApplication的几个虚函数才能达到控制器的作用,而且OgreApp1这个类也是继承了BaseApplication这个类,所以我又

2015-01-15 22:14:08 5985

原创 来自知乎:关于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 803

原创 又是一个链接库的问题

今天又碰到一个链接库的问题。。写了一个自己的链接库,然后需要在另一个程序中调用,在使用的时候总是提示:导致LIBCMTD.lib 和 MSVCRD.lib造成冲突一顿百度一个Debug版的dll链接时,VS会首先链接QT的Debug库,比如QtCoreD.dll,而QtCoreD.dll内部又一定链接了VC的Debug库,比如msvcrD.dll,自己写的dll

2014-12-27 17:44:19 450

原创 关于句柄类与重载操作符

好久没写文章了,重新开始吧。。这次看c++ primer的过程遇到一个句柄类的问题,感觉值得编写代码测试一下,想到之前一直对MFC中句柄概念不太熟悉,所以决定自己写一个句柄类实现一下。通过一下午对句柄类的研究,我个人感觉,句柄类其实就是对各种类的封装,同时又作为一个桥梁将父类与子类进行动态绑定。而且通过句柄类,你可以将你的父类,子类中不想要用户使用的变量或者函数置为private的,然

2014-12-26 20:53:58 517

转载 神经网络训练样本和测试样本的区别

训练样本是用来训练学习机的,测试样本是学习机要识别的对象。比如你想让一台电脑能识别茶杯,首先你要准备一个茶杯(训练样本),然后把茶杯给计算机看(数据输入),并告诉电脑说这样的东东是茶杯(期望输出),电脑看到茶杯后它认为是花盆,但看到你的期望是茶杯,他就不停训练自己这个是茶杯不是花盆,直到电脑他自己认为茶杯是茶杯后结束(这个过程叫学习),然后你把另一只茶杯(测试样本)放在电脑面前,并问他这是什么东东

2014-05-11 15:52:44 13228

原创 关于C++的static

今天打算在一个项目里面写个自己的类,结果发觉C++的类忘记了很多(看来不能总是跟java打交道,不然很容易把C++跟java的类)

2014-04-10 10:46:44 590

原创 收获的一天

今天拿到一个软件源码,需要配置环境,配了一上午,基本上是完成了,但是总是出现一些系统找不到指定路径的错误,因为考虑到项目有用到QT,于是按照http://www.cnblogs.com/rockhawk/archive/2010/12/15/1906956.html将vs2010配置好。发现还是出现 系统找不到指定路径 的错误。于是就去看每一个项目,发现其附加依赖项什么的关于路径的全部

2014-03-17 20:16:48 450

转载 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 781

转载 关于android的好的博客栏目(持续更新。。。)

http://www.cnblogs.com/zhangdongzi/category/280527.html

2014-03-14 16:30:17 417

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除