根据许多人的说法,除非你运行1.5或更高版本并使用volatile关键字,否则java会破坏一些常见的Double-Checked Locking成语.
一个破损的双重检查锁定样本:
// Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null)
helper = new Helper();
}
return helper;
}
// other functions and members...
}
Run Code Online (Sandbox Code Playgroud)
该示例来自本文,其中还提供了有关如何修复它的详细信息:http: //www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Pugh上面的分析是针对Java VM的.我在Android上工作并经常使用采用Double-Checked Locking的库.dalvik VM的内存模型是否支持这个习惯用法?
以下是如何创建圆形的剪裁区域:
Path path = new Path();
path.addCircle(200,200,100,Direction.CW);
c.clipPath(path); // c is a Canvas
Run Code Online (Sandbox Code Playgroud)
现在Canvas上有一个剪裁区域,可以防止在该圆圈范围之外绘制任何东西.但是,如果我想将剪裁区域塑造成甜甜圈(或其他),该怎么办?
我尝试使用创建第二个Path并在其上使用toggleInverseFillType,然后将其添加到原始路径,但这似乎不起作用.
或者,不是使用Path,而是可以创建一个Bitmap用作蒙版,并以某种方式将其设置为Canvas上的剪贴蒙版?
编辑:答案正是我需要一个小的补充.在画布上执行多个操作时,请始终在第一个clipPath调用上使用Op.REPLACE.这将替换该Canvas上的任何现有clipPath.
作为参考,我在这里发现了6个不同的Region.Op值的含义.想象一下有2个圆圈的维恩图."B"是2个圆圈重叠的部分."A"是不重叠的左圆."C"是不重叠的右圆.
c.clipPath(a,Region.Op.REPLACE);
c.clipPath(b,???);
Region.Op.DIFFERENCE -> A..
Region.Op.INTERSECT -> .B.
Region.Op.REPLACE -> .BC
Region.Op.REVERSE_DIFFERENCE -> ..C
Region.Op.UNION -> ABC
Region.Op.XOR -> A.C
Run Code Online (Sandbox Code Playgroud)
"." 表示未绘制的部分.对不起,如果不是特别清楚.没有图形很难很好地描述.
我目前正在Android平台上撰写论文.经过一番研究,很明显Dalvik还有改进的余地.我想知道,你觉得开发人员在这个目标上的最佳用途是什么?
JIT编译似乎是一个很大的问题,但后来我也听说过这种资源在这么低资源的机器上使用有限.有没有人有资源或数据支持这一点?
是否还有其他选择需要考虑?除了开发强大的本机开发工具包以绕过VM.
对于那些感兴趣的人,有一个关于Dalvik VM的录音和在线讲座.
任何想法都欢迎,因为这个问题似乎是主观的,我会澄清我接受的答案必须有一些理由提出修改.任何支持它的数据,例如Sun JVM引入时的改进,都将是一个巨大的优势.
我知道这可能是一个愚蠢的问题,但我的背景更多是用c ++和管理自己的记忆.
我目前正在削减我可以从我的一个游戏中尝试减少垃圾收集频率和感知"滞后"的每一个分配,所以我创建的每个变量都是一个Object(例如String和Rect)我我确保我先在构造函数中创建它,而不是在简单的10行函数中创建临时变量...(我希望这是有道理的)
无论如何我今晚工作得更多,我意识到我对垃圾收集的假设可能完全错误,原始类型(int,boolean,float)是我在10行函数中创建的原始类型变量每秒20次增加我的垃圾收集问题?
所以一年前我每隔几秒就会在logcat中看到一条消息
GC在101ms内释放了4010个对象/ 484064个字节
现在我每隔15-90秒左右看到一条消息......
所以重新解释我的问题:看到这条消息时是否包含原始类型(int,float,boolean等)?
Java中的默认浮点类型是double.如果您将常量硬编码2.5到程序中,Java会自动将其设置为double.当您对可能从更高精度中获益的浮点数或整数执行操作时,类型将"提升"为double.
但是在Android API中,一切似乎都是从声音音量到矩形坐标的浮动.RectF在大多数绘图中都有一种叫做结构的结构; F代表浮动.对于那些(float)经常提升双打的程序员而言,这真的是一种痛苦.难道我们都不同意Java代码是如此混乱和冗长吗?
通常数学协处理器和加速器在Java中更喜欢双重,因为它对应于一种内部类型.有没有关于Android的Dalvik VM出于某些原因更喜欢花车?或者所有的浮动都是API设计中的变态的结果?
如果我socket()在JNI C方法中调用函数,应用程序仍将失败并出现权限错误.如果我在AndroidManifest.xml中放置一个uses-permission行,问题就解决了.
所以似乎在Dalvik虚拟机中没有实现Android权限检查,因为我正在调用本机C函数并且仍然会被检查.我想知道在Android内核中执行检查的方式,或者跟踪应用程序的方式是ptrace拦截每个系统调用,或者任何其他方式.非常感谢.
这不是一个问题.相反,当您使用外部API进行开发和Android.jar时,在Android中发现的常见问题的观察结果不会复制到您的项目中!
以下列表来自2008年的谷歌I/O演讲,称为"Dalvik虚拟机内部",它列出了从最高效率到最低效率循环遍历一组对象的方法:
(1) for (int i = initializer; i >=0; i--) //hard to loop backwards
(2) int limit = calculate_limit(); for (int i= 0; i< limit; i++)
(3) Type[] array = get_array(); for (Type obj : array)
(4) for (int i =0; i< array.length; i++) //gets array.length everytime
(5) for (int i=0; i < this.var; i++) //has to calculate what this.var is
(6) for (int i=0; i < obj.size(); i++) //even worse calls function each time
(7) Iterable list = get_list(); …Run Code Online (Sandbox Code Playgroud) 我知道在Android平台上有Dalvik(JVM)堆和Native堆.Dalvik GC在本机堆上没有工作.但我不确定这是如何工作的,我的意思是Android操作系统是如何将它们分开的?
可能的情况1:由独立的内存硬件组成(我不相信太多)
可能的情况2:Android操作系统对两个堆都有固定的内存量
可能的情况3:Android OS必须在必要时将部分Dalvik内存堆分配为本机堆,因此本机堆和Dalvik堆的大小是灵活的.
哪一个是真的,或者我没有提到的可能性?
我从dalvikvm获得了太多的GC_FOR_ALLOC.我从REST服务获取XML:在一个活动中,我以编程方式解析了大约100行(me),在另一个活动中,我使用SimpleXML来解析大约200行.
在第一个中,我获得了50个GC_FOR_ALLOC.在第二个我得到300!(我甚至不能发布所有内容,机身制作29579个字符,并且只允许30k)
我搜索过,几乎每个人都抱怨gc_for_"M"alloc而不是gc_for_"A"lloc.
SimpleXML是问题因为创建了实例吗?
我将发布dalvikvm的logcat转储,也许这些值有一些信息.
非常感谢您的帮助.
12-11 06:13:49.564: D/dalvikvm(6759): GC_FOR_ALLOC freed 362K, 13% free 4116K/4688K, paused 181ms, total 182ms
12-11 06:13:50.074: D/dalvikvm(6759): GC_FOR_ALLOC freed 303K, 13% free 4134K/4708K, paused 142ms, total 142ms
.... repeated many times .....
12-11 06:14:06.254: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% free 4159K/4768K, paused 53ms, total 53ms
12-11 06:14:06.314: D/dalvikvm(6759): GC_FOR_ALLOC freed 103K, 13% free 4159K/4768K, paused 56ms, total 57ms
12-11 06:14:06.374: D/dalvikvm(6759): GC_FOR_ALLOC freed 29K, 12% free 4203K/4768K, paused 54ms, total 54ms
12-11 06:14:06.424: D/dalvikvm(6759): GC_FOR_ALLOC …Run Code Online (Sandbox Code Playgroud) android ×10
dalvik ×10
java ×3
android-ndk ×1
eclipse ×1
jit ×1
masking ×1
memory ×1
optimization ×1
performance ×1