Tag: jvm

这些java本机内存从哪里分配?

JDK版本是热点8u_45 我研究了我的java进程的本机内存。 本机内存甚至比堆消耗更多空间。 然而,有许多本机内存块让我感到困惑。 例如pmap -x的结果: 00007f8128000000 65508 25204 25204 rw— [ anon ] 00007f812bff9000 28 0 0 —– [ anon ] 00007f812c000000 65508 24768 24768 rw— [ anon ] 00007f812fff9000 28 0 0 —– [ anon ] 00007f8130000000 65508 25532 25532 rw— [ anon ] 00007f8133ff9000 28 0 0 —– [ anon ] 00007f8134000000 […]

如何使jvm加载我的java.lang.String而不是rt.jar中的那个

我经常研究java类加载器。 现在我想编写一个与rt.jar中的类名相同的包名和类名的类。 例如,自己编写一个java.lang.String类,以及如何打破父代委托模型以使jvm加载我的java.lang.String而不是rt.jar中的那个。 重新编辑 谢谢,试了一下。 ↓↓↓ D:\> java -verbose -Xbootclasspath / p:D:/myrt.jar -jar exe.jar [打开D:\ myrt.jar] [打开C:\ java \ jre \ lib \ rt.jar] [从C:\ java \ jre \ lib \ rt.jar加载java.lang.Object] [从D:\ myrt.jar加载java.lang.String] [从C:\ java \ jre \ lib \ rt.jar加载java.io.Serializable] [从C:\ java \ jre \ lib \ rt.jar加载java.lang.reflect.GenericDeclaration] [从C:\ java \ jre \ […]

如何模拟内存不足:请求的arrays大小超过VM限制

我使用了太阳网站的Out Of Memory帮助 。 引用的地方 内存不足:请求的arrays大小超过VM限制 这表示应用程序尝试分配大于堆大小的数组。 例如,如果应用程序尝试分配512MB的数组但最大堆大小为256MB,则将抛出此错误。 在大多数情况下,问题可能是堆大小太小或者错误导致应用程序尝试创建一个大小计算错误的数组。 我试图模仿这个 import java.util.ArrayList; import java.util.List; public class JavaTest { public static void main(String[] args){ long[] ll = new long[64*1024*1024]; } } 在我的机器上 javac *.java;java -Xmx256m JavaTest 但上面的线正在产生 线程“main”中的exceptionjava.lang.OutOfMemoryError:Java堆空间 在JavaTest.main(JavaTest.java:7) 我错过了什么? 更新:我的java版本是 $ java -version java版“1.6.0_15” Java(TM)SE运行时环境(版本1.6.0_15-b03) Java HotSpot(TM)服务器VM(内置14.1-b02,混合模式)

64位JVM上的Object引用的内存要求

对32位JVM(至少在Hotspot上)上的对象的引用占用4个字节。 64位Hotspot JVM需要8个字节吗? 或是一些聪明的压缩正在进行? 如果没有,每个Object[]都需要两倍的堆内存,我不知何故(希望,期待)并非如此。 更新/额外问题 :这是否真的重要,或者这是一个可以忽略不计的增加,因为大多数引用指向远大于几个字节的对象(而有人可能会争辩说这些对象主要是由对其他对象的引用组成) ?

如何检测String.substring是否复制字符数据

我知道对于Oracle Java 1.7更新6及更高版本,当使用String.substring ,会复制String的内部字符数组,对于旧版本,它将被共享。 但我发现没有官方API会告诉我当前的行为。 用例 我的用例是:在解析器中,我喜欢检测String.substring复制还是共享底层字符数组。 问题是,如果共享字符数组,那么我的解析器需要使用new String(s)显式“取消共享”以避免内存问题。 但是,如果String.substring仍然复制数据,那么这不是必需的,并且可以避免在解析器中显式复制数据。 使用案例: // possibly the query is very very large String query = “select * from test …”; // the identifier is used outside of the parser String identifier = query.substring(14, 18); // avoid if possible for speed, // but needed if identifier internally // references […]

使用Sigar API获取JVM CPU使用率

我正在使用Sigar来获取应用程序服务器中当前运行的JVM的CPU使用率,并将其存储为此数据的历史视图,但我总是获得0%的CPU百分比。 同时,我保持我的visualVM开放以监控CPU使用率,并且我看到CPU%在visualVM中定期更改,而它总是使用Sigar报告0%。 这是我定期运行的代码: Sigar sigar = new Sigar(); ProcCpu cpu = null; long pId = sigar.getPid(); // This one gives me the same process ID that I see in visualVM try { cpu = sigar.getProcCpu(pId); } catch (SigarException se) { se.printStackTrace(); } System.out.print(cpu.getPercent()); 此代码始终为0%。 在这种情况下,我做错了什么? 如何让Sigar显示类似于VisualVM中显示的CPU使用率? 我尝试添加 cpu.gather(sigar, pId); 在调用getProcCpu(pid)之后,即使我不断增加和减少服务器上的负载,我仍然只获得两个值(0.0和9.08729312E-315)…

数组类如何在Java中工作?

在Java中,array是一个类并扩展了Object。 我很想知道这个特殊的数组类。 我没有在任何地方找到类定义。 执行getClass()。getName()会得到奇怪的结果。 String[] array = new String[]{“one”,”two”}; System.out.println(array.getClass().getName()); // prints [Ljava.lang.String; 我想了解arrays是如何工作的。 数组类定义是否在JVM中进行了硬编码? 任何资源,书籍,链接都会对您有所帮助。 谢谢。

Java“太多常量”JVM错误

我正在开发一个在运行时生成和编译类的应用程序。 这有时会产生大量生成的代码。 在我们的一个测试用例中,我从JVM收到错误: TestClass.java:83865: too many constants 只是这个。 我已经看到有关类似错误的其他报告,但在这些情况下,错误消息抱怨常量池。 但在这种情况下它没有。 如果这意味着达到了JVM常量池的限制,那意味着什么? 我的意思是,就Java代码而言,这些常量是什么? class级方法? 场? 文字? 我没有静态或最终方法也没有字段。 你能给我一些线索吗? 编辑: 将代码拆分为多个类已经按计划进行。 虽然不是出于这个原因。 我意识到恒定池的限制,我的怀疑正是进入的原因。 生成的代码不超过10000个方法+字段。 我怀疑的是文字是否也会进入常数池,因为这是我看到将这个数字提高到65K的唯一原因。 看来是这样。

多个JVM进程可以共享公共类的内存吗?

我想在我的Web服务器上运行多个Java进程,每个Web应用程序一个。 我正在使用一个Web框架(Play),它有很多支持类和jar文件,Java进程使用大量内存。 One Play过程显示大约225MB的“驻留私人”内存。 (我在Mac OS X上使用Java 1.7.0_05进行测试。)特定于应用程序的代码可能只有几MB。 我知道典型的Java Web应用程序是添加到一个服务器进程(Tomcat等)的jar,但看起来运行Play的标准方法是作为独立的应用程序/进程。 如果这些是C程序,那么200MB的大部分将是共享库,而不是在每个应用程序中重复。 有没有办法在Java中实现这一点? 我看到一些关于类数据共享的页面,但这似乎只适用于核心运行时类。

如何计算(和指定)java进程允许的总内存空间?

我有一个系统,它不能为Java进程提供超过1.5 Gb。 因此,我需要一种确切的方法来指定java进程设置,包括java内部的所有内存种类和可能的fork。 一个特定的java进程和系统来说明我的问题: 我目前的环境是Ubuntu Linux 9.10下的java 1.6.0_18。 我使用以下JVM选项启动大型Java服务器进程:“ – Xms512m -Xmx1024m -XX:PermSize = 256m -XX:MaxPermSize = 512m” 现在,“top”命令报告该进程使用1.6gb内存… 问题: 1 – 如何计算java进程使用的最大空间? 如果可能,请提供准确的公式。 (Smth。赞:max.heap + max.perm + stack + jvm space = maximal space) 2 – 在我的情况下linux下臭名昭着的fork行为是什么? 分叉的JVM是否会占用额外的1.6 GB(导致总内存量为3.2 Gb)? 3 – 必须使用哪些选项来绝对确保在任何时候使用不超过1.5gb? 谢谢 @rancidfishbreath:“ulimit”将确保java不能占用超过指定数量的内存。 我的目的是确保java不会尝试这样做。