- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我需要垃圾收集器的帮助。减少 GC 时间的方法之一是更快地到达安全点。
在启动 GC 之前,所有线程必须停放在安全点。
安全点是执行流程中的一个“特殊位置”,可以安全地停止线程以执行GC。
我想最大限度地减少代码中等待安全点的时间。哪种编码风格可以帮助我更快地到达安全点?
什么风格会让这项任务更不舒服?
在风格下,我指的是语言中有助于(或阻止)快速“获取”安全点的一切。
示例:
磁盘 IO 工作是否会使问题变得更加严重?
JNI 是否会让问题变得更加严重?
Thread.sleep() 会让事情变得更困难吗?
synchronized(..) 会让事情变得更难吗?
等等..
简而言之,哪些java操作和方法会使快速“获取”安全点出现问题?有什么帮助?
最佳答案
让我们从以下注释开始(来自 OpenJDK 源代码中的“src/hotspot/share/runtime/safepoint.cpp”文件):
// Java threads can be in several different states and are
// stopped by different mechanisms:
//
// 1. Running interpreted
// The interpreter dispatch table is changed to force it to
// check for a safepoint condition between bytecodes.
// 2. Running in native code
// When returning from the native code, a Java thread must check
// the safepoint _state to see if we must block. If the
// VM thread sees a Java thread in native, it does
// not wait for this thread to block. The order of the memory
// writes and reads of both the safepoint state and the Java
// threads state is critical. In order to guarantee that the
// memory writes are serialized with respect to each other,
// the VM thread issues a memory barrier instruction
// (on MP systems). In order to avoid the overhead of issuing
// a memory barrier for each Java thread making native calls, each Java
// thread performs a write to a single memory page after changing
// the thread state. The VM thread performs a sequence of
// mprotect OS calls which forces all previous writes from all
// Java threads to be serialized. This is done in the
// os::serialize_thread_states() call. This has proven to be
// much more efficient than executing a membar instruction
// on every call to native code.
// 3. Running compiled Code
// Compiled code reads a global (Safepoint Polling) page that
// is set to fault if we are trying to get to a safepoint.
// 4. Blocked
// A thread which is blocked will not be allowed to return from the
// block condition until the safepoint operation is complete.
// 5. In VM or Transitioning between states
// If a Java thread is currently running in the VM or transitioning
// between states, the safepointing code will wait for the thread to
// block itself when it attempts transitions to a new state.
//
据此我得出以下结论:
但这只能部分回答问题。问题在于 JIT 编译代码中的安全点轮询是通过 JIT 编译器添加的指令完成的。控制此操作的逻辑未指定1,并且可能依赖于实现。此外,我听说使用 System.arraycopy 和其他内置/内在操作进行内存复制可能会在没有安全点检查的情况下花费很长时间。
关于您的具体示例:
Is disk IO work making it more problematic?
显式 I/O(例如通过 read
和 write
调用)没有问题。内存映射文件 I/O 可能会出现问题;见下文。
Is JNI making it more problematic?
没有。
Is
Thread.sleep()
making it more hard?
没有。
Is
synchronized(..)
making it harder?
没有。
对于您的一般问题:
What style makes this task [of reaching safepoints] more uncomfortable?
避免长时间计数的循环。
避免会产生大量虚拟内存页面缺失的事情。
页面缺失问题是,当应用程序代码尝试读取或写入当前不在 RAM 中的虚拟内存页面时,操作系统必须从磁盘读取它。这种情况对应用程序来说是透明的……但是在这种情况发生时,尝试访问页面的线程被阻塞。在此过程中,它将无法到达下一个安全点。
容易导致页面未命中次数过多的因素有:
如果磁盘设备速度较慢,这种影响将会加剧。
<小时/>1 - 根据 this source ,轮询被插入到非计数循环中的向后分支以及方法入口或导出处。这是依赖于平台的
关于java GC : what programming style makes safe point attainment easier (faster)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217855/
我有一个对象,其属性的计算成本很高,因此它们仅在第一次访问时计算然后缓存。 private List notes; public List Notes { get
我正在选择datetime列中具有特定日期的记录,但感觉有点草率,我想知道是否有更好的方法。我的查询如下所示: SELECT * FROM myTable WHERE event_d
我正在尝试改进编码,最近遇到了自定义异常(exception)和“比许可更容易请求宽恕”(EAFP)的概念,但在我看来,自定义异常(exception)仍然遵循该概念。 例如,在下面的代码中,A看起来
//lets get the auto name set $accepted = 0; $sql = mysql_query("SELECT * FROM ".TBL_FACTIONS." WHERE
我正在尝试编写一个程序来处理各种对象的检测。这些对象具有原点、宽度、高度和速度。有没有一种方法可以设置数据结构/算法,以便每个对象都不会与其他所有对象进行检查? 我试图避免的问题的一些示例代码: fo
前一段时间我有一个类似的问题,但对整个 IoC/DI 主题以及我想要实现的目标的了解要少得多,所以这里又来了.... 我正在构建一个供公司内部通用的库。公共(public) API 中最常用的部分已经
是否有一种更简单的方法来编写我的程序,以便我可以将基于图 block 的 map 绘制到面板(某种形式)上,这样每次调整窗口大小时(关闭可调整大小) map 都不会重新绘制?我意识到这对于调试和测试我
我有大约 10 个使用相同事件的文本框 - 然后我只是将 sender 转换为文本框并对文本进行任何更改。我很好奇,有没有更简单/更简洁的方法将这些事件分配给代码隐藏方法?现在,我只是通过将每个事件的
我正在尝试在 Java 中实现一个退出堆栈,它目前正在给我带来机会!哈哈 我已经走到这一步了,据我所知,我的逻辑是合理的,但它无法编译。我不断收到 java.lang.ArrayIndexOutOfB
最近我接手了一个用 C#/XAML 编写的 Windows 应用商店应用程序项目,其要求之一是, 将项目迁移到 Javascript/HTML5,并通过从我们的网站动态加载 javascript,我们
我需要有关方法、算法或工具的建议来满足我的需求; SQL 中的动态过滤。 我使用 PHP 作为后端。我在前端创建结果过滤,如下所示: 单击“确定”后,我使用以下方式发送 JSON 数据: JSON.s
在 Chrome 检查器中,是否有比以下更好的编辑实时 CSS 的方法: 必须在“元素”和“来源”选项卡之间来回切换 将检查器样式表中的内容复制/粘贴到您的真实样式表中 在文件和文件夹窗口中找到您真正
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我有一个 PhoneGap/Cordova 项目,这意味着我必须结合使用 JQuery 和 CSS 转换来实现动画(JQuery 动画在 iOS 上很笨重)。 我编写了一些实现一系列下拉菜单的代码,但
是否有更简单或更新的方法能够,例如,点击一个按钮并点击该按钮,重新路由到一个新路径? ....除了在组件上使用上下文方法之外? 谢谢 最佳答案 有几种方式: 1. withRouter - 来自 re
目前,我可以使用“在路径中查找”功能并键入 Artifact 的名称(或在 pom.xml 中搜索)来检查项目是否具有该依赖项,但这不适用于传递依赖项。 我可以在 IntelliJ(或命令行)中生成依
我有一个用 C# 编写的应用程序,该应用程序当前向 LDAP 进行身份验证。我们希望扩展功能以支持 IBM 的 Tivoli Access Manager,它由一个策略服务器和一个 LDAP 服务器(
假设我想根据同一字段中的值选择数据子集。现在我必须做这样的事情 TestLocationsResults = FILTER SalesData by (StoreId =='17' or StoreI
为什么“请求宽恕比获得许可更容易”(EAFP)被认为是 Python 中的良好实践?作为一名编程新手,我的印象是与使用其他检查相比,使用许多 try...except 例程会导致代码臃肿且可读性差。
这是一个与this fascinating question about detecting divide by zero exceptions at compile time相关的问题. 从 Eri
我是一名优秀的程序员,十分优秀!