首页
学习
活动
专区
圈层
工具
发布

码仔漫画:来自JVM的灵魂拷问:“你是什么垃圾?”(上)

GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。...在0-1的世界里,所谓“垃圾回收”,就是指收回那些不可能再被任何途径使用的对象所占的内存空间,释放了这些内存可以给需要的对象使用。 那么JVM里是怎么来分的?或者说哪些对象是需要被回收的?...比如一把椅子的靠背坏了,椅子的轮子还是好的,但这轮子不能拆下来挪为他用,所以椅子的靠背和它的轮子是互相引用的,但是除了它们自己,没有外界引用它们了。...这样的情况用“引用计数法”来判断的话,它们还是不用被回收的,但实际它们都没有使用作用了。 所以主流的jvm都不使用引用计数法来管理内存,而是采用下面的可达性分析法,下图是它的基本思路示意图。...按照上面的例子,坏了的椅背和没坏的轮子都属于椅子对象(object5),但是椅子本身不被使用,就没有引用到它们的引用链了。 ? ? ? 可以做GC Roots的对象 这个大图是不是挺熟悉? ?

49240

Shenandoah GC:一个来自JDK12的全新并发压缩垃圾回收器

这个阶段还会搞明白需要被清理(evacuated)的region(即垃圾收集集合),并且通常为下一阶段做准备。...Concurrent Cleanup 回收即时垃圾区域 -- 这些区域是指并发标记后,探测不到任何存活的对象。...Concurrent Evacuation 从垃圾收集集合中拷贝存活的对到其他的region中,这是有别于OpenJDK其他GC主要的不同点。...Shenandoah就是这样一个OpenJDK为更近这个目标而设计的开源、低停顿时间的垃圾回收器。 替代方案 1. Zing/Azul是一个没有停顿的垃圾收集器,但是不会贡献给OpenJDK。 2....基于colored pointers设计的ZGC也是一个拥有很低停顿时间的垃圾收集器,Shenandoah期望能与之一战。 3.

1.7K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MFC对话框模式下,控件的数据交互

    //获取控件文本 ((CEdit*)GetDlgItem(IDC_EDIT))->SetWindowText(text); //给控件设置文本显示 方法四:利用GetDlgItemText(ID,字符串变量...)和SetDlgItemText(ID, 字符串); SetDlgItemText(IDC_SHOW, showText); GetDlgItemText(IDC_SHOW, showText); 方法五...;第一个参数是该控件的句柄,根据其的获得方式,又可以更详细划分 int num1, num2, num3; char ch1[10], ch2[10], ch3[10]; ::SendMessage...(GetDlgItem(IDC_EDIT1)->m_hWnd, WM_GETTEXT, 10, (LPARAM)ch1); //此处加上::表示调用的是win32API函数,而不是类的成员函数, //第一个参数是控件句柄...,两种方法获得,此处利用函数获得;发送系统消息WM_GETTEXT; ::SendMessage(m_edit2.m_hWnd, WM_GETTEXT, 10, (LPARAM)ch2); //利用控件的

    1.8K10

    星号密码探测工具 - 代码远程线程注入的简单运用

    用处不大的原因是:这个程序的的能力相当有限, 只能查看一部分安全性不高的软件的密码框里面的程序, 如果你要拿它来看QQ的密码, 想当然, 那是不可能了....程序使用到了一种非常古老的技术来实现获取其它进程密码框的内容:远程线程注入后,使用WM_GETTEXT消息来获取 指定Edit的内容....之所以说非常古老, 是因为这种方法早在2003年就有一牛人在CodeProject上面发表了这样的文章, 我的这个程序大部分代码来自上面的文章, 不过基本全部是我自己重新写的, 只写了核心部分, 实现了功能即可...工作原理: 大家都知道, 在当前进程内通过发送WM_GETTEXT消息给某控件, 就可以取得控件的文本, 但是, 当你取得不属于当前 进程的控件句柄, 想要获取其文本的时候, 你认为可能吗?..., 并执行WM_GETTEXT, 并使远程线程与当前进程进程间通信, 取得密码.

    62410

    【推荐】.NET类库“Vanara”:简单易用的Windows API封装库

    此项目包含各种.NET程序集,这些程序集包含来自Windows库的P/Invoke函数、接口、枚举和结构。每个程序集都与一个或几个紧密相关的库相关联。...单击程序集链接将带您深入了解该程序集的覆盖范围。找到你的函数,如果有一个匹配的实现,它会出现在右边。您还可以使用GitHub的项目搜索(页面左上角)来搜索函数、方法或常量。确保选择“在此存储库中”。...转到他们的库页面(单击部分中的链接),浏览每个库中包含的类。 设计理念 从单个DLL导入的所有函数都应放置到以DLL命名的单个程序集中。...(例如,程序集Vanara.PInvoke.Gdi32.dll承载系统目录中从gdi32.dll导出的所有函数和支持的枚举、常量和结构。)...尽可能,分配调用方释放的内存的所有函数都使用安全的内存句柄。 程序集中所有PInvoke调用都以'Vanara.PInvoke`为前缀。

    2.4K10

    Nature最新爆料计算机生成的垃圾文章竟还能被接受,64%来自中国

    科学是一个循序渐进的过程,新的发现与进步往往是建立在已有科学文献的基础上。也就是说,未来科学成果的质量与可信度取决于以往发表研究的正确性。虚假文章的泛滥,正在影响人们对科学的信任!...由计算机程序写的水文居然被举办已超过10年的会议接收,暴露了一些学术会议不经同行评审、随意接收毫无学术价值的文章的现象。这个事件在当时引发了全网的曝光与讨论。...后来,他与来自法国图卢兹大学的计算机科学家Guillaume Cabanac想到了一个新的方法:查找SCIgen输出中的典型短语。...目前,有46篇文章已经从它们首次发表的网站上被撤下或删除。 之后,他们又发现了20篇这类论文,包括由MATHgen(一款生成数学研究论文的软件)与SBIR(一款生成研究提案的软件)创建的垃圾文章。...IOP的经理Kim Eggleton说:“我们有合理的证据怀疑,这些论文的同行评审没有达到合格标准。”

    90320

    MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.

    GetDlgItemText(控件ID,字符串缓冲区);   2.根据控件ID.设置控件的标题.   SetDlgItemText(控件ID.字符串); 二丶编写代码.获取编辑框中的字符串的个数....我们给编辑框关联的.那么查询MSDN可以看到控件的操作方法. ? 如果获取字符串可以使用这两个函数.获取跟设置. 也可以设置编辑框的最大字符数....::SendMessage(GetDlgItem(EDT_EDIT)->m_hWnd,WM_GETTEXT,12,(LPARAM)ch1); 参数2: 消息类型.我们WM_GETTEXT 是代表我要获取这个文本...你可以给数组.也可以给结构体.都是可以的. 设置字符串....SendDlgItemMessage(控件ID.WM_GETTEXT,附加参数,附加参数); //使用例子 SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,12,(

    4.1K30

    .NETC# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉

    当我们不再使用某个对象的时候,此对象会被 GC 垃圾回收掉。当然前提是你没有写出内存泄漏的代码。我们也知道如果生成了大量的字符串,会对 GC 造成很大的压力。...但是,如果在编译期间能够确定的字符串,就不会被 GC 垃圾回收掉了。 ---- 示例代码 下面,我创建了几个字符串,我关心的字符串是 "walterlv","lindexi" 以及一个当前时间。...,而当前时间字符串我们都知道是编译期间不能确定的字符串。...在 GC 收集之前和之后,ConditionalWeakTable 中的对象数量从三个降到了两个。 并没有清除成 0 个,说明字符串现在仍然是被引用着的。 那被什么引用着呢?是字符串暂存池。...要理解字符串暂存池,可以阅读我的另一篇博客: .NET/C# 的字符串暂存池 另外,即便设置了 CompilationRelaxations.NoStringInterning,编译期间能确定的字符串在上述代码中也是不会被垃圾回收的

    33540

    2019-3-7-手把手教你PInvoke

    ---- 这个时候你就会接触到一些美妙的dll,比如user32.dll,kernal32.dll 当然这些是非托管的代码,我们在.net中无法直接使用,所以我们会需要使用PInvoke进行调用 于是你会使用...所以我们一步步来看如何将c++的MessageBox转化为我们C#中的签名 手把手PInvoke 首先打开Programming reference for Windows API -Microsoft...第2,3个参数都是LPCTSTR LPCTSTR = L‌ong P‌ointer to a C‌onst T‌CHAR String 所以这是一个字符串,我们此处使用string ?...,里面聚集了各种pinvoke的写法,如果不清楚怎么使用,可以去其中查看 另外vs也带有pinvoke的插件,使用方法可以参见吕毅同学的博客使用 PInvoke.net Visual Studio Extension...辅助编写 Win32 函数签名 - walterlv 参考链接: pinvoke.net: the interop wiki!

    1.2K30

    dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑

    有两个主要的选项,第一就是自己写 PInvoke 代码,第二就是使用其他大佬给许多 Win32 函数封装好的库。...由于只生成项目所使用到的 Win32 函数的 PInvoke 代码,此库可以做到极少的代码浪费。...函数的 PInvoke 代码,生成的体积更小 下面来让我介绍一下 CsWin32 库的使用方法 这是一个使用 SourceGenerator 源代码生成技术,生成对 Win32 函数的 PInvoke...封装的库,也就是说这个库是没有最终需要发布的 DLL 的存在的,而是将 Win32 函数的 PInvoke 封装写入到自己的项目里面。...Win32 函数的封装的代码的质量还是不错的,写的十分标准,包含了入口点,和对字符串的处理,加上设置 LastError 和 DLL 寻找地方以及对应的系统版本,更重要的是还能自动拷贝注释过来 本文的代码放在

    1.7K30

    .NET简谈互操作(七:数据封送之介绍)

    从这篇文章起我们将进入到.NET互操作的数据封送阶段,数据封送是.NET/Pinvoke关键的部分,任何托管代码想要和非托管代码互操作,少不了数据的传递返回;[王清培版权所有,转载请给出署名] 1:...由于托管的数据类型与非托管的数据类型内存结构可能是不一样的,要想将托管数据参数传递到非托管代码中,并且能成功的接受到非托管的返回值,我们需要很严格的按照双方的数据类型约定来才行。...比如在C++中的Char*是一个字符指针,当我们想要将字符串传递到非托管代码中时,我们需要考虑怎么将参数无差错的封送到非托管代码。...在我们用.NET/PInvoke进行Win32API的调用的时候,大多数的情况下我们是需要传递某种结构类型给API,然后在接受返回值;在数据封送的过程中,有些概念是我们平时不曾碰见的。....这是封送引用地址的方式,如果我们传递给非托管API的是非平台类型,那么CLR的封送拆收收器会将我们的托管类型复制出来进行非托管类型转换,然后将转换后的数据传递给非托管,这样的过程是复制数据的过程。

    73520

    2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。 1 <= x <= 10^5。 来自百度。

    2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。 1 <= x <= 10^5。 来自百度。...答案2023-07-31: 大体步骤如下: 1.初始化一个字符串builder,用于构建结果字符串。 2.初始化一个字符变量cur,初始值为'r',用于轮流使用字符'r'、'e'和'd'构建回文串。...• 将满足条件的m值赋给ans,并继续搜索更大的m值。 5.对于当前找到的number,使用循环将字符cur添加到字符串builder中,重复number次。...8.根据当前的cur字符,顺序更新cur为下一个字符。 • 如果cur是'r',则更新为'e'。 • 如果cur是'e',则更新为'd'。 • 如果cur是'd',则更新为'r'。...注意,这是一个循环的过程。 9.返回构建好的字符串builder。 总时间复杂度为O(x * log(x)),总空间复杂度为O(1),其中x是输入的值。

    30620

    Unity3d底层数据传递分析

    二 封送 在C#中的string,通过内部调用传给C++时,会使用MonoString* ,它是指向托管堆对象的字符串类型指针,这个转换就是封送(Marshalling)。...另一种不必封送的情况是指针传递,例如通过引用传递结构体到非托管代码,只会拷贝结构的指针。当然,也可以通过MarshalAs来自定义封送策略。 需要谨记的是,这两部分内存则完全独立。...例如,引用类型(类,数组,字符串,接口)作为值传递时,出于性能考虑会被标注为[In]。这也是默认标记,即不做从非托管拷贝回托管的操作。 2、结构体的传递 结构体与类有两点不同: 1....但指针来说,需要注意避免在函数运行时被垃圾回收掉。例如下面的代码: ? 当执行完c.m()后,GC就会回收C的实例。...https://en.wikipedia.org/wiki/Marshalling_(computer_science) http://www.mono-project.com/docs/advanced/pinvoke

    1.8K20

    Unity3d底层数据传递分析

    另一种不必封送的情况是指针传递,例如通过引用传递结构体到非托管代码,只会拷贝结构的指针。当然,也可以通过MarshalAs来自定义封送策略。 需要谨记的是,这两部分内存则完全独立。...例如,我们要返回字符串,就先要在C++中显示注册接口。...[11.gif] 例如,引用类型(类,数组,字符串,接口)作为值传递时,出于性能考虑会被标注为In。这也是默认标记,即不做从非托管拷贝回托管的操作。...但指针来说,需要注意避免在函数运行时被垃圾回收掉。例如下面的代码: [16.png] 当执行完c.m()后,GC就会回收C的实例。...https://en.wikipedia.org/wiki/Marshalling_(computer_science)http://www.mono-project.com/docs/advanced/pinvoke

    4K21
    领券