如何建设网站简介,深圳公司网站设计公,公众号开发展模式下文章归类到菜单,网页制作三剑客是什么java堆内存和堆外内存最近#xff0c;我正在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多。 代码创建的所有Java对象都是在Java堆空间内创建的#xff0c;其大小由-Xmx选项定义。 但是一个Java进程由很多空间组成#xff0c;而不仅仅是Java堆空间… java堆内存和堆外内存 最近我正在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多。 代码创建的所有Java对象都是在Java堆空间内创建的其大小由-Xmx选项定义。 但是一个Java进程由很多空间组成而不仅仅是Java堆空间。 以下是组成Java进程的一些空格 加载的库包括jar和class文件 Java堆的控制结构 线程栈 生成的JITed代码 用户本机内存在JNI中分配 … 更多… 在32位体系结构系统中总进程大小不能超过4GB。 因此一个32位的Java进程由许多空间Java堆本机内存C-Heap和其他空间组成并且其分配的空间不能超过4GB。 假设在32位生产系统上长时间运行具有-Xmx 1.5 GBJava堆设置为1.5 GB的Java应用程序服务器并且已部署了许多应用程序。 一段时间后客户希望在同一应用程序服务器上部署更多应用程序。 系统操作员理解由于服务器将不得不处理更多的请求因此还需要创建更多的对象并进行更多的处理。 因此作为将来的解决方案运营商决定将Java进程的最大堆增加到2 GB。 好的这看起来是个好方法但实际上在此生产应用程序服务器上实际发生了什么 这是真实情况。 应用程序服务器因OutOfMemoryError崩溃 您能考虑一下可能的原因吗 我的第一个想法是2 GB的内存不足以支持所有这些应用程序。 不幸的是问题出在其他地方。 您现在怎么看 我会帮你一点。 java.lang.OutOfMemoryError: requested 55106896 bytes for Chunk::new. 真正的原因是对于本机C-Heap内存需要已部署旧的应用程序太大。 在操作员增加堆大小从1.5GB到2 GB之前他们没有监视旧应用程序所需的本机内存空间。 此操作的副作用是自动将Java进程本机内存的可用最大大小从2.5 GB减小到2GB。 由于旧的应用程序已经使用了如此大的本机内存因此此更改会使服务器崩溃 在这种情况下唯一可以接受的解决方案是避免增加最大堆大小部署新应用程序并减少吞吐量。 这不是一个完美的解决方案但这是在这种情况下唯一可行的解决方案因为我们的Java进程必须为32位。 特别是在32位系统中在增加Java堆大小之前请了解Java进程本机内存的所需大小。 如果您处于这两个空间冲突的情况下那么解决方案可能不是那么容易。 如果您不能更改代码来克服这种情况那么最常见的解决方案是移至最大进程大小限制太大的64位系统。 有四件事要记住 进程大小的最大限制 Java进程的大小不仅由Java堆组成 无法明确配置Java进程的本机C堆内存的大小因为Java堆空间可以 应用程序所需的Java堆空间和本机C堆内存空间的大小仅由应用程序定义并且这两个空间之间没有任何标准比率 参考来自 Java的JCG合作伙伴 Adrianos Dadis的Java堆空间本机堆和内存问题 集成和源博客的优点 。 翻译自: https://www.javacodegeeks.com/2013/01/java-heap-space-native-heap-and-memory-problems.htmljava堆内存和堆外内存