- 博客(110)
- 资源 (9)
- 收藏
- 关注
原创 垃圾收集器
针对于具体的情况,JVM使用不同的垃圾收集器。按照不同分代,HotSpot使用了七种垃圾收集器:① 新生代:Serial,ParNew,Parallel Scavenge② 老年代:CMS,Serial Old(MSC),Parallel Old③ 通用:G1 如图。连线表示可搭配使用。1. Serial收集器Serial...
2018-02-27 15:44:02 155
原创 垃圾回收时的安全点与安全区
垃圾回收时,首先要枚举所有GC Roots节点。然而枚举GC Roots节点是需要停顿执行系统的。执行系统的停顿不可以过久,否则会影响整个系统的执行。为了能快速计算出对象内什么偏移量上是什么类型的数据,从而迅速完成枚举,HotSpot使用OopMap。OopMap是个Map,记录了所有必要信息的具体地址。 然而,OopMap是需要空间的。若每一条指令都创建一个对应的OopMa...
2018-02-27 15:42:57 514
原创 垃圾回收算法
1. 标记-清除算法首先标记出所有需要回收的对象,标记完成后统一回收所有标记对象。该算法是最基础的回收算法。主要问题是:标记和清除的效率不高;标记清除后会产生大量不连续内存碎片,以至于程序要分配大内存时无法找到足够的连续内存,从而不得不提前触发下一次垃圾清理。2. 复制算法将内存划分为容量相等的两块。每次只使用一块。当内存1用完时,就把所有活着的对象顺序复制到内存2上,然后对内存1进行...
2018-02-27 15:42:23 169
原创 常量池垃圾回收:判断类的存活
方法区中的常量池也需要进行垃圾回收。主要回收对象是废弃的常量和无用的类。其中,判断类的存活需要同时满足以下3个条件:1. 该类所有的实例已经被回收,即Java堆中已经不存在任何该类的实例。2. 加载该类的ClassLoader已经被回收。3. 该类对应的java.lang.Class对象没有在任何地方被引用,即无法在任何地方通过反射访问该类的方法。同时满足这3个条件的类,就是可回...
2018-02-27 15:41:34 1013
原创 判断对象存活:可达性分析算法
判断对象存活,常用的方式是引用计数器:每当对象被一个地方引用,计数器便+1;当引用失效时,计数器-1。当对象的计数器为0时,该对象便是一个不被使用的对象,即“死亡”。引用计数器实现简单,效率高。然而难以解决对象之间相互循环引用的问题(两个失效对象相互保存了对方的指针)。故JVM判定对象是否存活,并没有使用引用计数器,而是使用可达性分析算法。可达性分析算法即:有一系列“GCRoots”起点,从这些点...
2018-02-27 15:40:53 1201
原创 对象的访问定位
Java栈的本地变量表中,存储着一个reference数据,其中存储着一个引用。reference就是用来操作堆上的具体对象的。而一个引用如何定位和访问堆中对象的具体位置,有两种方式:句柄和直接指针。1. 句柄Java堆中划分一块内存作为句柄池。reference存储了对象的句柄地址。而句柄中就包含了对象实例数据等具体的地址信息。当对象被移动时,只会修改句柄中的实例数据指针。referenc...
2018-02-26 08:45:56 240
原创 JVM对象内存布局
HotSpot虚拟机中,对象在内存中的存储布局分3部分:对象头,实例数据,对齐填充。一. 对象头对象头包含两部分信息:对象的运行时数据和类型指针。1. 对象的运行时数据对象的运行时数据非常多,主要有哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等。① 哈希码:对象的标识。② GC分代年龄:GC即Java的垃圾回收机制。Java堆分两部分:新生代堆和老...
2018-02-26 08:45:23 321
原创 Java对象创建过程
1. 用户new一个对象。2. JVM检查常量池,看是否可定位到一个类(所对应的符号引用),并检查该类是否已经加载,解析和初始化。若没有,则执行类加载过程。3. 类加载检查通过,JVM为新对象分配内存。由于类已经加载完成,所以内存大小是可以确定的。分配过程就是从Java堆中划分一块内存出来。JVM维护了一个空闲内存列表,记录了所有可用的内存块。分配时划分一块足够大的内存出来。这称...
2018-02-26 08:44:34 260
原创 Java堆,方法区,直接内存
Java的内存区中,为线程共有的有三部分:Java堆,方法区,直接内存。其中方法区中包含运行时常量池。直接内存并不属于Java的常规内存区。1. Java堆是被所有线程共享的一块内存,在启动虚拟机时创建。通常,所有的对象实例及数组都要在堆上分配。但并不绝对。2. Java堆可扩展。其内存在物理上可以不连续。当Java堆无法再扩展时,将抛出内存不足异常。3. Java的垃圾收集器主...
2018-02-26 08:44:01 394
原创 程序计数器,虚拟机栈和本地方法栈
Java的内存区中,为线程私有的有三部分:程序计数器,虚拟机栈,本地方法栈。1. Java虚拟机的程序计数器用于指定程序所执行字节码的行号。2. Java的多线程是用时间片轮转的方式实现的。每个线程都有自己的程序计数器,称之为线程私有,用于轮转到自己时从上次执行位置继续执行。3. 每个线程执行时,都会创建一个栈,称为虚拟机栈。而每个方法在执行时,需要存储变量表,操作数,动态链接和...
2018-02-26 08:42:46 1211
原创 SVG的viewBox与放缩
SVG的viewBox用于划定可视区域的大小。要对SVG对象进行缩放,必须设定viewBox的大小,通常设为与SVG对象大小相同。设定viewBox大小后,再设置svgDoc的大小,即可对SVG的显示进行整体放缩。...
2018-02-24 16:18:29 4013
原创 OpenGL加速渲染:顶点数组的索引模式
使用顶点数组时,往往要将所有需要使用的顶点放入数组中,以便于统一调用。 比如一条折线:GLfloat vPoints[] = { 0.0, 0.0, 0.0, //折线端点0 1.0, 0.0, 0.0, //折线端点1 1.0, 0.0, 0.0, //折线端点1 1.0, 1.0, 0.0 //折线端点2}; ...
2018-02-10 08:26:30 1790
原创 OpenGL加速渲染:顶点数组
加速渲染主要有两种方法:显示列表与顶点数组。 其中,显示列表是通过预编译方式加速,而顶点数组是通过优化实时编译方式加速。但是,不需要同时使用两种加速方式。如果把顶点数组放在预编译中,然后通过显示列表来显示,这样做所耗时间与直接使用顶点数组所耗时间基本相同。 使用顶点数组,也就是把所有点存储在一个数组中,然后将该数组的地址属性通知给OpenGL,然后...
2018-02-10 08:26:28 1521
原创 OpenGL自定义相机与模型:GLFrame
GLFrame叫参考帧,其中存储了1个世界坐标点和2个世界坐标下的方向向量,也就是9个glFloat值,分别用来表示:当前位置点,向前方向向量,向上方向向量。GLFrame可以表示世界坐标系中任意物体的位置与方向。无论是相机还是模型,都可以使用GLFrame来表示。对任意一个使用GLFrame来表示的物体而言,涉及到的坐标系有两个:永远不变的世界坐标系,针对于自身的物体坐标系(即绘图坐标系)。...
2018-02-10 08:26:26 2611 3
原创 OpenGL视图变换及gluLookAt
视图变换,即相机变换,其作用是把相机放在指定位置并使其对准场景。该变换是针对相机的变换,不会影响到模型。视图变换决定了相机的位置与方向,因此可以通过视图变换来改变相机位置与方向,从而达到从各个不同的位置与角度来观察同一个物体的情形。进行视图变换使用的函数为:void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdoub...
2018-02-10 08:26:23 1726
原创 OpenGL物体显示被截断:视景体与相机的运动与作用
OpenGL中,成功显示了一个图形,然后图形不动,仅仅移动照相机,将照相机拉远,渐渐地会发现图形开始被某个平面截断了,显示不全。 相应地,如果照相机不动,移动物体,随着物体朝某个方向一直持续移动,会发现物体也开始被某个平面截断。这种情况很好解释,这是因为物体平移出了视景体区域,视景体的边界就会把物体截断。虽然视景体没有移动,但是物体移动了。 实际上...
2018-02-10 08:26:21 1979
原创 OpenGL投影变换:视景体及glFrustum、gluPerspective 与glOrtho、gluOrtho2D
一. 视景体视景体是指成像景物所在空间的集合。它是一个空间集合体。 注意视景体指的是一个空间集合。一般来说,集合中的每个空间都是个立方体。然后所有的这些空间堆在一起,在外侧取一个最大的外接立方体,就是可显示的区域,该可显示区域也是一个视景体。在这个可显示区域内,放置着可以显示的物体。注意,可以显示的物体仅仅是拥有显示权限,但是不一定显示,这取决于相机等其他因素...
2018-02-10 08:26:18 4724
原创 OpenGL目标场景产生的变换过程
一般而言,OpenGL目标场景产生的变换过程分为5步:① 将未安装镜头的相机固定在指定位置上,并调整好镜头的朝向(视图变换)② 对场景进行安排,将各个物体摆放在指定位置(模型变换)③ 选择照相机镜头并安装,同时整放大倍数,使得3D场景可以在照相机的CCD上形成一个清晰的平面图像(投影变换)④ 确定最终照片的大小。(视口变换)⑤ 进行拍照。(绘制场景) 如...
2018-02-10 08:26:16 448
原创 对话框未显示时GetWindowRect()获取坐标左上角为0
GetWindowRect()函数得到的是相对应于屏幕左上角的坐标。但是若在对话框的OnInitDialog()函数中使用RECT parentWindow;this->GetWindowRect(&parentWindow);得到的左上角却是(0,0);其原因是:对话框在执行OnInitDialog()的时候还没有显示,这时候对话框的左上角与屏幕左上角是重合的。所以该操作得到的区...
2018-02-09 15:34:20 828
原创 MFC异形对话框
基本原理:获取窗体区域,指定一个颜色为透明色,遍历位图,将图上所有该色区域从窗体区域中去除。这样最后就得到了一个异形窗体。然后把背景图绘制在该窗体上。注意绘制的时候,作为透明的部分依然会被以原色绘制。但是由于绘制的地方并没有窗体,故而是显示不出来的。 在对话框的OnInitDialog()函数中加入以下代码:CDC* pDC = GetDC();//获得设备上下文CDC memDC;CBitm...
2018-02-09 15:34:17 623
原创 控件截获主对话框WM_KEYDOWN消息后按键所发出的警告音
自定义了一个控件类,为了能让控件响应快捷键,需要重载父对话框的WM_KEYDOWN消息,将消息截获,并发送给控件。如:BOOL COpenGLDemoDlg::PreTranslateMessage(MSG* pMsg){ // TODO: Add your specialized code here and/or call the base class if (pMsg->messa...
2018-02-09 15:34:14 399
原创 SVG对象:延迟获取
引入一个SVG文件:<embed id="mySVG" src="map.svg" type="image/svg+xml" />这样就能在浏览器中看到SVG的图。然而 ,要想在js中直接获取到SVG的对象:svgDoc = document.getElementById("mySVG").getSVGDocument();却会提示svgDoc为null。即使将该行代码放在ready函...
2018-02-09 15:34:11 931 1
原创 向指定窗口发送一个BN_CLICKED消息
向指定窗口发送一个BN_CLICKED消息设一个对话框上有一个按钮,现在鼠标正在按钮上方为了向该对话框发送消息来响应该按钮的BN_CLICKED消息(注意不可以向按钮发送,而是要向对话框发送,因为按钮是将消息发往对话框,由对话框来响应)。BOOL CYuCvImageControl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){ // ...
2018-02-09 15:34:08 1492
原创 SVG动态添加元素与事件
SVG文件是由各个元素组成。元素由标签定义,而标签格式即html的元素定义格式。但是载入一个SVG文件,却无法通过常规的js获取对象方式来获取到SVG中定义的元素,更无法通过这种方式来动态添加SVG元素与事件。SVG元素的操作都要借助于SVG的document对象。SVG的document对象获取方式为:svgDoc = document.getElementById("mySVG").getSV...
2018-02-09 15:34:05 10092
原创 MFC控件响应鼠标中键OnMouseWheel
控件必须获取焦点才能响应OnMouseWheel。因此首先要在控件的OnLButtonDown里调用SetFocus();。然后重载控件的OnMouseWheel函数:BOOL CYuCvImageControl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){ // TODO: Add your message handler code...
2018-02-09 15:34:03 7401
原创 MFC重载鼠标停留WM_MOUSEHOVER和离开WM_MOUSELEAVE消息
1. 重载OnMouseMove()消息,在消息的实现中添加代码:void CMainWindow::OnMouseMove(UINT nFlags, CPoint point){ TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); //结构体缓冲区大小 tme.dwFlags = TME_HOVER; //注册WM_MOUSEHOVER消息 t...
2018-02-09 15:34:00 2765
原创 MFC改变鼠标指针的形状
只要重载当前窗口的OnSetCursor()函数即可。在OnSetCursor()函数中:添加代码:::SetCursor(AfxGetApp()->LoadCursor(cursorID));//读取并设置鼠标指针形状return TRUE;//return CBitmapButton::OnSetCursor(pWnd, nHitTest, message);//把这一行注释掉其中A...
2018-02-09 15:33:58 1373
原创 VC的路径
1.注意#include "../Common/MyTD.h" 这里面的目录表示方式与CFile saveFile;saveFile.Open(_T("\\abc.bmp"),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);这两种路径表达方式是不一样的。2. 绝对路径:_T(“D:\\Project\\imageTe...
2018-02-09 15:33:55 441
原创 Glut键盘控制
在Glut中,键盘按键分两种:普通按键与特殊按键。其中:① 普通按键为:字母+数字,以及其他可以用ASCII表示的字母。注意ESC(对应ASCII码27)属于普通按键② 特殊按键为:↑↓←→,PageUp,PageDown,Home,End等普通按键所使用的按键响应函数为:void glutKeyboardFunc(void(*func)(unsigned char key, int x, i...
2018-02-09 15:32:30 1694
原创 OpenGL加速渲染:显示列表glGenLists
在OpenGL中,可能要用非常多的点、线、面来构成一幅图。若进行实时渲染,无疑对显示效率有非常大的影响。比如要画几百万个三角形,那么很可能旋转一下图片需要响应很久。为了加速渲染,可以将需要绘制的部分放在显示列表glGenLists中。每一个绘制的部分都是一个显示列表成员。然后将该列表进行预编译,编译完后并不显示。当需要显示的时候,直接调用显示列表,由于已经经过了预编译,所以此时会不经编译直接显示,...
2018-02-09 15:26:13 3955
原创 VC ini文件的默认路径
ini配置文件如果使用默认路径,则注意该默认路径是系统的路径。程序启动情况下,该路径是程序根目录。程序启动后若调用了文件选取操作,则会更改该默认路径。若依然按照原来的思路直接通过默认路径去选取文件,则可能会读取失败。...
2018-02-08 08:31:53 318
原创 VC ini配置文件常用操作
A.读写ini文件ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。写函数(一个):BOOL WritePrivateProfileS...
2018-02-08 08:31:49 608
原创 MFC HOOK的使用
首先要将钩子装入:HHOOK m_menuHook;m_menuHook = SetWindowsHookEx(WH_MSGFILTER, HookProc, NULL, GetCurrentThreadId());然后实现钩子函数:LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam){ if (code == ...
2018-02-08 08:31:47 2037
原创 环境变量与DLL等文件引用
VS所使用的环境变量有两种:一种是系统环境变量,在我的电脑上单击右键选属性设置;另一种是VS环境变量,或者叫VS路径,需要在VS中选Tools->Options->Projectsand Solutions->VC++ Directorise来设置,(从VS2010开始该选项的位置已经更改到了Project->XX工程属性->Configuration Propert...
2018-02-08 08:31:45 4285 1
原创 MFC中DLL的创建
可创建的MFC DLL有三种:① Regular DLLusing shared MFC DLL: MFC动态链接常规DLL。需要MFC动态链接库。该类型DLL既可以被MFC程序使用也可以被一般的Win32程序使用。② Regular DLLwith MFC statically linked:MFC静态链接常规DLL。这种DLL将要使用的MFC的类代码直接加入到DLL中,从而使得DLL增大。...
2018-02-08 08:31:42 708
原创 接受拖放文件
需要重载类的WM_DROPFILE消息。接受拖放的文件并显示路径与文件名的示例:void CYuEdit::OnDropFiles(HDROP hDropInfo){ // TODO: Add your message handler code here and/or call default UINT nFilesDroppedCount = DragQueryFile(hDropInfo...
2018-02-08 08:31:39 234
原创 窗口的位置:GetWindowRect与MoveWindow等
父对话框的整个窗口区=父对话框客户区+父对话框标题栏区1. GetWindowRect()获取的是以屏幕左上角为(0,0)点的窗口区域,是屏幕坐标系。① 如果对父对话框调用GetWindowRect(),那么获取的矩形为父窗口在屏幕中的区域,其中矩形区含标题栏以及外边框。② 如果对控件调用GetWindowRect(),那么获取的矩形是控件在屏幕中的区域。注意在对话框的OnInitDialog...
2018-02-08 08:31:36 2960
原创 OnNotify与OnChildNotify以及CStatic的DrawItem实现源代码
OnNotify是用于子控件向父窗口发送消息用的。该消息的接收对象是父窗口。OnChildNotify是子控件向父窗口发送消息后,父窗口反射消息给子窗口用的。该消息的接收对象是子窗口。如:CDialog上有一个CStatic。在CStatic上点击鼠标,则CStatic会发送OnNotify消息给CDialog。CDialog接收OnNotify消息并处理。然后CDialog会发送OnChildN...
2018-02-08 08:31:34 1383
原创 MFC矩形、窗体与图像宽高:差1且不同
一.矩形 在MFC中,矩形的宽定义为:width= rect.right-rect.left 如矩形为:RECT rect;rect.left = 0;rect.top = 0;rect.right = 9;rect.bottom = 9; 则矩形: 宽 = rect.right-rect.left =...
2018-02-08 08:31:31 406
原创 GetDlgItem所获取CWnd*的时效性
GetDlgItem所获取的窗口CWnd*并非一定是全局的。① 若控件绑定了变量,那么通过GetDlgItem所获取的CWnd*是全局的。对该CWnd*进行保存,随时都可以正确调用② 若控件没有绑定变量,仅仅只有一个ID,那么通过GetDlgItem所获取的CWnd*仅在当前函数体内有效。函数体结束时,该CWnd*会被释放。所以,如果对CWnd*进行了保存,当在其他函数内调用...
2018-02-08 08:31:29 632
jdk-8u241-windows-x64.rar
2020-03-17
OpenCV图像在MFC中显示
2014-01-26
MFC扩展位图按钮 实现不同状态切换 异形按钮 提示等
2012-10-31
MFC扩展位图按钮类
2012-10-30
MFC中使用flash按钮并交互
2012-05-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人