Tag: jvm

易失性变量和非易失性重新排序/可见性

所以我认为我已经足够了解这些东西,直到我读到让我怀疑这个主题的东西。 我几乎可以肯定这本书是不正确的,但也想问社区。 PS:没有看过这本书的勘误,所以很可能被误认为是错误的。 一个简化的例子: public class VolatileMain { private volatile int a = 0; private String text = “”; public static void main(String[] args) throws Exception { VolatileMain vm = new VolatileMain(); Thread writer = new Thread() { @Override public void run() { System.out.println(“Running thread ” + Thread.currentThread().getName()); vm.text = “hello world”; vm.a = 5; […]

-Xms JVM在引用堆内存时意味着什么?

究竟什么-Xms在Java堆内存方面意味着什么? 我们运行1024-2048 min-max内存分配。 由于一些问题,我们将其从2048调低至最高1728,从1024调整到512分钟。 -Xms如何影响堆内存分配以及为什么在-Xms值减少时最大内存减少?

字节码是否被视为JVM的指令集?

我正在阅读维基中的 instruction set ,我看到了这段话: 一些支持字节码作为其ISA的虚拟机,如Smalltalk,Java虚拟机和Microsoft的公共语言运行时,通过将常用代码路径的字节码转换为本机机器码来实现。 此外,这些虚拟机通过解释执行不常用的代码路径(请参阅:即时编译)。 Transmeta以这种方式在VLIW处理器上实现了x86指令集。 这究竟意味着什么? bytecodes是用于JVM ISA ,而JVM又支持处理器的ISA 。

为什么在Java中创建MAX_INT大小的数组是不可能的?

我已经阅读了这个问题的一些答案( 为什么我不能创建一个大尺寸的数组?和https://bugs.openjdk.java.net/browse/JDK-8029587 ),我不明白以下内容。 “在GC代码中,我们将单词中对象的大小作为int传递。” 据我所知,JVM中单词的大小是4个字节。 根据这一点,如果我们将大字长数组(例如,MAX_INT – 5)的大小作为int传递,我们必须得到OutOfMemoryException, 请求的数组大小超过VM限制,因为大小对于int来说太大了没有标题的大小。 那么为什么不同类型的数组对元素的最大数量有相同的限制?

ProcessBuilder – 启动另一个进程/ JVM – HowTo?

我正在编写一个网络应用程序,其中每个客户端都有一个Singleton ClientManager。 为了测试 ,我想创建几个客户端(每个客户端都在自己的VM /进程中),而不是手动启动程序n次。 有关stackoverflow的以下两个问题已经描述了如何做到这一点: 这真的是从Java代码启动第二个JVM的最佳方法吗? Java:在单独的进程中执行Java应用程序 我的代码基于这些,但它不起作用: 调用spawn后,主程序不会继续。 生成的代码不会被执行。 这是使用ProcessBuilder的完整代码: public class NewVM { static class HelloWorld2 { public static void main(String[] args) { System.out.println(“Hello World”); System.err.println(“Hello World 2”); } } public static void main(String[] args) throws Exception { startSecondJVM(HelloWorld2.class, true); startSecondJVM(HelloWorld2.class, false); System.out.println(“Main”); } public static void startSecondJVM(Class clazz, boolean redirectStream) throws […]

什么是给jvm的线程堆栈大小选项(-Xss)? 为什么Windows PC中至少有68k的限制?

我见过JVM选项-Xss – 它到底做了什么? 这个链接,但我的问题是这个选项是如何有用的。 因为,如果我们为-Xss值设置了一个非常小的限制,那么线程可能无法正常工作,因为它可能会在大多数情况下抛出stackOverflow错误。 为什么这个值至少有64k的限制? 我是如何得到这个64k限制的,当我试图在IntelliJ iDE上配置运行时vm选项时,我试图给出一些像10k这样的东西,它弹出这个错误,说它需要至少64k的线程堆栈大小。 另一个问题是,如何从java程序中找到我的嵌入式设备中运行的jvm的默认线程堆栈大小? 谢谢, 森

如何找出确切的年轻/老年人在记忆中的位置?

最近我能够使用sun.misc.Unsafe类获取对象的地址。 现在我试图以编程方式找到我的对象所在的实际生成。 为此,我想知道每一代的起点和终点。 如果Java(Oracle JVM)提供了解决此问题的任何工具? 我不相信,因为即使不同的GC需要不同的内存结构(例如G1),这使得任务更加有趣:) 我想知道的只是代表内存中几代边界的几个数字,如下所示: young gen: start point – 8501702198 end point – 9601256348 愿意听到关于黑魔法的最疯狂的想法,这些想法可以确定不同代区域在记忆中的位置。

如何启动无限内存的JVM?

如何启动没有堆最大内存限制的JVM? 这样它可以占用尽可能多的内存吗? 我搜索了是否有这样的选项,但我似乎只找到-Xmx和-Xms选项。 编辑: 假设我有一台4GB内存的服务器,它只运行我的应用程序。 而且,假设我有另一台32GB RAM的服务器。 我不想以4GB的内存限制启动我的应用程序,因为第二台机器应该能够处理更多的对象

从数据库加载26MB文本数据消耗了258MB的JVM堆

在启动时本地运行的应用程序(Spring,JPA Hibernate,Sybase 12,Webapp)消耗基于VisualVM的40MB 256MB堆空间。 当我触发返回70,000多行(文本数据没有blob)的搜索时,堆空间图最多可以拍摄256MB并且会丢失内存。 我已经通过使用setMaxResults(limit)解决了这个问题。 但是,当我查询相同的数据,复制粘贴到文本文件并保存到文件系统时,我可以看到大小只有26MB的文本。 因此,实际上,从数据库中加载26MB的文本消耗了216MB(从256-40),这些数据在内存不足时消耗190MB ? 也许这将是框架,但我不知道它如何比正在加载的实际数据消耗更多…… * *再次注意我用setMaxResults(限制)解决了这个问题,我的问题不是为了教育目的而是为了做什么而是为什么。

如果使用的JVM是x86或x64,则以不同方式解析Maven依赖关系?

我有一个Maven存储库设置为托管一些dll,但我需要我的Maven项目下载不同的dll,具体取决于使用的JVM是x86还是x64。 因此,例如,在运行x86版本的JVM的计算机上,我需要将ABC.dll作为依赖项从存储库下载,但在运行x64版本的JVM的另一台计算机上,我需要它下载XYZ.dll。 我该怎么做呢? 一个示例pom.xml文件会很好。