我从一些文档中读到,Hotspot VM利用名为Oop Maps的数据结构来管理VM中的所有OOP.我的问题是,这个Oop Map数据结构何时生成?在编译时还是运行时?任何有关此问题的进一步详细文件都将受到欢迎.感谢你们.
我现在对java左移操作有点困惑,
1<<31 = 0x80000000 --> this I can understand
Run Code Online (Sandbox Code Playgroud)
但
1<<32 = 1 Why is this?
1<<33 = 2
Run Code Online (Sandbox Code Playgroud)
看起来更多的移动值,采用模数32的值.
感谢大家的回复和JLS的报价.
我只想知道更多.知道它以这种方式设计的原因吗?或者只是一些惯例?显然C没有这个怪癖?
感谢@paxdiablo.看起来像C声明这个行为未定义.
我在这里有一些个人假设:
ARM体系结构参考手册A7.1.38
语法LSL Rd,Rm,#immed_5
哪里:
Rd 是存储操作结果的寄存器.
Rm是包含要移位的值的寄存器.
immed_5指定移位量,范围为0到31.
在指令级别,immedidate immed_5只需要5位就可以避免无意义的操作,从而节省一些指令空间.我想高级语言只是将这个约定统一起来,以避免在编译指令时产生无意义的努力.
现在我可以通过/proc/meminfo知道系统总体的缓存页面,那么我是否可以进一步知道对于一个特定的进程它消耗了多少页面缓存?我的第一个想法是将进程的 smap 中的所有 RSS 相加。还有更多建议吗?谢谢。
我有以下泛型方法,返回一个通用数组:
public static <T> T[] genericMethod1(List<T> input) {
T[] res = (T[]) new Object[input.size()];
int i = 0;
for (T t : input) {
res[i] = t;
i++;
}
return res;
}
public static <T> T genericMethod2(List<T> input) {
return input.get(0);
}
Run Code Online (Sandbox Code Playgroud)
但后来当我尝试使用以下结果获取结果数组时:
LinkedList<Integer> list = new LinkedList<Integer>();
list.addFirst(1);
list.addFirst(1);
Integer[] i = (Integer[]) genericMethod1(list); // 1) Runtime error
Integer j = genericMethod2(list); // 2) works
Run Code Online (Sandbox Code Playgroud)
对于案例1,我总是在运行时遇到错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么以及如何正确返回通用数组?谢谢.
以下是我的理解,如果我错了,请纠正我. …
我以这种方式声明了一个静态本机方法:
public native static void test(int w, int h);
然后我用 JNI 的方式声明了它:
void testJni(JNIEnv* env, jint w, jint h)
奇怪的是,w总是收到一个值看起来像一个指针,似乎 jclass/jobject 被传递给第一个参数w。
相反,如果第一个参数不是 a jint,比如 a jstring,事情会正常工作。
有人可以解释为什么会这样吗?谢谢。
由于对象的默认哈希值是对象的对象地址,因此在32位机器上,考虑到哈希值是一个int值,这是有道理的.我的问题是在64位机器上,地址应该是64位对吗?那么32位int哈希值怎么样?是否会有一些下转换(从64位到32位)?
我最近遇到了由故障添加器0xfffffab8引起的SEGV_MAPPER故障.但是没有地方可以明确地调用此地址.所以我使用arm-linux-androideabi-objdump转储了这样的库,并在函数中找到了几个地方:
000a42f8 <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()>:
a42f8: 4b08 ldr r3, [pc, #32] ; (a431c <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()+0x24>)
a42fa: 4a09 ldr r2, [pc, #36] ; (a4320 <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()+0x28>)
a42fc: 447b add r3, pc
a42fe: b510 push {r4, lr}
a4300: 4604 mov r4, r0
a4302: 589a ldr r2, [r3, r2]
a4304: 4907 ldr r1, [pc, #28] ; (a4324 <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()+0x2c>)
a4306: 320c adds r2, #12
a4308: 6022 str r2, [r4, #0]
a430a: 585b ldr r3, [r3, r1]
a430c: f103 0108 add.w …Run Code Online (Sandbox Code Playgroud) 我阅读了几篇文章,其中包括 SO为什么 ARM PC 寄存器指向下一个要执行的指令之后的指令?,该 pc 寄存器值实际上是当前执行指令地址加上前面的 2 条指令,因此在 ARM 状态下它是 +8 字节(2*32 位)。
我的问题是,对于拇指状态,可能有 16 位或 32 位指令,这是否意味着对于 16/32 位指令,获取 pc 地址可能是 +4 字节或 +8 字节的偏移量?
例如:
279ae6: f8df 9338 ldr.w r9, [pc, #824] --> pc value= 279aea or 279aee
279aea: f44f 7380 mov.w r3, #256
279aee: 48cd ldr r0, [pc, #820]
Run Code Online (Sandbox Code Playgroud)
我使用以下代码进行了更多测试:
1598: 467b mov r3, pc
159a: f8bf 4000 ldrh.w r4, [pc] ; 159c
159e: 46f9 mov r9, pc
15a0: f83f 5001 ldrh.w r5, [pc, …Run Code Online (Sandbox Code Playgroud) 假设我们有以下代码:
int func(char str[], int len) {
// Don't return anything here.
}
int main() {
char str[] = "Hello";
int result = func(str, strlen(str));
printf("%d\n", result);
}
Run Code Online (Sandbox Code Playgroud)
它会在我的电脑上打印一些字符串值-1679929632.当我执行时,它会不时变化.
谁能解释为什么会这样?
java ×5
arm ×2
android ×1
assembly ×1
bit-shift ×1
c ×1
compilation ×1
file-mapping ×1
gcc ×1
generics ×1
hash ×1
jvm ×1
jvm-hotspot ×1
kernel ×1
linux-kernel ×1
stack-frame ×1
thumb ×1