Tag: jvm

exception访问违规Java?

我正在编写一个JNI项目,我在尝试运行Java代码时遇到以下错误日志。 它告诉我有问题的框架是一个jvm.dll,并试图隔离问题,我试图找出我的问题究竟在哪里(在JVM与我的本机代码)我附加了线程日志部分,如果需要可以附加其余部分。 我也尝试重新安装JVM。 Java运行时环境检测到致命错误: pc = 0x6d8fefb5的EXCEPTION_ACCESS_VIOLATION(0xc0000005),pid = 720,tid = 3128 JRE版本:6.0_21-b07 Java VM:Java HotSpot(TM)客户端VM(17.0-b17混合模式,共享windows-x86)有问题的框架:V [jvm.dll + 0xfefb5] —————线程————— 当前线程(0x02189000):JavaThread“main”[_thread_in_vm,id = 3128,stack(0x02120000,0x02170000)] siginfo:ExceptionCode = 0xc0000005,读取地址0x00000000 寄存器:EAX = 0x00000000,EBX = 0x02189118,ECX = 0x02189000,EDX = 0x6da2f76c ESP = 0x0216fa84,EBP = 0x0216facc,ESI = 0x02189000,EDI = 0x00000000 EIP = 0x6d8fefb5,EFLAGS = 0x00010246 堆栈顶部:(sp = 0x0216fa84)0x0216fa84:0216fb38 0216fae4 34497370 0216faa0 0x0216fa94: […]

如何计算java中执行的字节码数量

我要参加麻省理工学院的电竞比赛。 参赛者编写的程序可以控制相互对抗的机器人。 问题在于你的机器人只能在一个回合中执行一定数量的字节码(去年每回合10000次)。 现在,简单的循环就像 (int i=0; i<100; i++){ // do nothing } 根据他们的软件,使用大约400字节码(大概是这样的(用于递增i的2字节码加上用于检查i <100的2字节码)* 100 = 400字节码)因此我们必须编写非常紧密的代码。 因此,当我尝试一些不同的导航算法时,重要的是我能够弄清楚我的代码使用了多少字节码 – 我该怎么做? (这是可能的 – 他们这样做,我只是不确定如何!而且,他们必须阻止JIT以某种方式进入游戏。我知道每个机器人都在一个单独的线程中运行,所以我肯定答案涉及某些我不知道的线程技巧。)

不同语言的数组 – 存储引用或原始对象?

我试图在使用数组时围绕原始内存在不同语言中的样子。 请考虑以下Java代码: String a = “hi”; String b = “there”; String c = “everyone”; String[] array = {a, b, c}; 显然数组是持有引用 ,而不是对象; 也就是说,在三个引用的内存中存在一个连续的数组,每个引用指向对象所在的内存中的某个其他位置。 因此,物体本身不一定是坐在三个连续的桶中; 相反,参考文献是。 现在考虑一下: String[] array = {“hi”, “there”, “everyone”} 我想在这种情况下,字符串存在于内存中的所有其他常量,然后数组保存对内存中这些常量的引用? 所以,再次,在原始内存中,数组看起来不像[‘h’, ‘i’, ‘\0’, ‘t’, ‘h’, ‘e’, ‘r’, ‘e’… (etc)] 。 (为方便起见,使用c式终止)。 相反,它更像是[‘a83a3edf’ ,’a38decd’ … (etc)] ,其中每个元素都是一个内存位置(引用)。 我在这个思考过程中得出的结论是,在Java中,你永远不能将数组想象成内存中连续对象的桶,而是连续的引用。 我想不出有什么方法可以保证对象总是在Java中连续存储。 现在考虑C: char *a = […]

Jmeter java.lang.OutOfMemoryError:超出了GC开销限制

我正在使用Jmeter将工作负载注入部署在AWS EC2实例上的应用程序。 测试必须非常庞大:它持续10个小时,工作负载配置文件具有双峰形状,在5分钟内有大约2600个请求。 实际上我有一个m3.xlarge实例,其中部署了应用程序,8个m3.xlarge实例,每个实例运行一个jmeter实例。 使用python脚本,要注入的工作负载在8个客户端实例之间进行分割,因此在示例中,如果原始工作负载要注入800个请求,则每个jmeter实例将注入100个请求。 我所说的完整测试持续10个小时,分为每个5分钟的时间步长。 每5分钟应用一点工作负载变化。 实际上我从每个jmeter实例得到java.lang.OutOfMemoryError:GC开销限制在测试开始后立即超出了错误并且没有请求到达应用程序。 我在网上和stackoverflow上看了很多,我总结出可能的错误可能是: JMV堆大小太低 – >我解决了在每个jmeter实例的jmeter.bat文件中设置以下内容: 设置HEAP = -Xms4g -Xmx4g 设置NEW = -XX:NewSize = 4g -XX:MaxNewSize = 4g 代码中的一些错误导致继续无用的垃圾收集器。 所以我从测试中删除了所有的jmeter监听器。 特别是我使用的是TableVisualizer,ViewResultsFullVisualizer,StatVisualizer和GraphVisualizer。 无论如何问题仍然存在。 我真的不知道如何解决它。 我知道用2600音调请求进行10小时测试可能是一个非常繁重的测试,但我认为应该有一种方法来执行此操作。 我正在使用EC2 m3.xlarge实例,所以我甚至可以将堆大小提高到8G(如果它有用),或者将工作负载分成更多的客户端,因为我使用的是spot实例,所以我不会付出这么多,但是因为我已经将客户端实例的数量从4增加到8,以便解决问题并且不起作用我有点困惑,我想知道r建议,然后继续获得越来越多的资源。 非常感谢你提前。

JVM如何知道在运行时捕获exception的位置?

根据我的理解, throw是一个灵长类似的jvm命令。 调用它时,JVM“检查当前调用堆栈是否可以捕获它”。 如果它不能,那么java只是简单地弹出调用栈,就像调用一个返回一样。 然后jvm“检查当前调用堆栈是否可以捕获它”等等递归。 我的问题:JVM在算法上如何知道调用堆栈中哪些地方可以捕获给定的exception? 每个调用堆栈条目中是否存储了元数据,将exception映射到代码块? 堆中是否有一个静态数据结构以某种方式跟踪它? 因为某处必须有数据跟踪。

HotSpot可以内联lambda函数调用吗?

考虑代码: someList.forEach(x -> System.out.format(“element %s”, x)); 从理论上讲,应该可以通过首先内联forEach方法来内联此代码并消除间接函数调用,然后在内联的forEach代码中内联lambda函数体。 HotSpot能够执行此优化吗? 在特定情况下是否执行了哪些限制?

用Java编码文件名

我在嵌入式Linux平台上运行一个小型Java应用程序。 用OpenJDK替换Java VM JamVM后,无法正确存储带有特殊字符的文件名。 像变音符号这样的特殊字符被问号所取代。 这是我的测试代码: import java.io.File; import java.io.IOException; public class FilenameEncoding { public static void main (String[] args) { String name = “umlaute-äöü”; System.out.println(“\nname = ” + name); System.out.print(“name in Bytes: “); for (byte b : name.getBytes()) { System.out.print(Integer.toHexString(b & 255) + ” “); } System.out.println(); try { File f = new File(name); […]

强制jvm返回本机内存

我不时在需要大量内存的eclipse任务中运行。 所以jvm在任务运行时吞下大约2-3GB的RAM,没关系。 但是一旦jvm占用了那个内存它就不会释放它而且我有一种情况,当堆中使用的内存大约为200mb,总堆大小约为3gb时,这实际上是不需要的,因为其他程序正在寻找内存。 我尝试了Max/MinHeapFreeRatio参数来强制jvm减少未使用内存的消耗。 那是我的eclipse config.ini文件: -startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar –launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502 -vm c:/Program Files/Java/jdk1.6.0_26/bin/javaw.exe -showlocation -product org.eclipse.epp.package.jee.product –launcher.defaultAction openFile –launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform –launcher.XXMaxPermSize 256m –launcher.defaultAction openFile -vmargs -Duser.name=Michael Nesterenko -Dosgi.requiredJavaVersion=1.5 -Xms512m -Xmx4096m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=30 但这没有用,我仍然有很多未使用的内存。

将值存储为变量还是再次调用方法更好?

最近,我开始学习一些Java。 从我已经了解的JVM开始,看起来JIT在需要CPU周期的操作(即调用方法)上使得它非常快,但也使它对内存感到饥饿。 因此,当我需要与之前相同的方法输出相同的输出时,通常更好的方法是将输出存储在变量中并再次使用它 – 同时将其保存在内存中 – 或者再次调用相同的方法?

Eclipse 32位在64位JVM上运行

经过多次调查后,我无法找到以下问题的明确答案:Eclipse 32位版本可以在64位JVM上运行(当然是在64位窗口上)吗? 我猜答案应该是“不”,但我从未使用64位系统,并且有兴趣“了解更多”它的工作原理。 提前致谢, 马努