网赌网站怎么做的,企业公众号如何开通,给客户做网站 客户不付尾款,市场调研分析报告模板转载自 Java启动参数与内存调优一些学习笔记
.参数的含义-Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存#xff0c;按需分配 -XX:PermSize64M JVM初始分配的非堆内存
-XX:MaxPermSize128M JVM最大允许分配的非堆内存#xff0c;按需分配
JVM内存模型
…转载自 Java启动参数与内存调优一些学习笔记
.参数的含义-Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存按需分配 -XX:PermSize64M JVM初始分配的非堆内存
-XX:MaxPermSize128M JVM最大允许分配的非堆内存按需分配
JVM内存模型
1、程序计数器
程序计数器Program Counter Register是一块较小的内存空间它的作用可以看做是当前线程所执行的字节码的行号指示器。 2、Java 虚拟机栈
与程序计数器一样Java 虚拟机栈Java Virtual Machine Stacks也是线程私有的它的生命周期与线程相同。
Java 内存区分为堆内存Heap和栈内存Stack这种分法比较粗糙Java 内存区域的划分实际上远比这复杂。
3、本地方法栈
本地方法栈Native Method Stacks与虚拟机栈所发挥的作用是非常相似的其区别不过是虚拟机栈为虚拟机执行Java 方法也就是字节码服务而本地方法栈则是为虚拟机使用到的Native 方法服务。 4、Java 堆Java 堆中还可以细分为新生代和老年代
再细致一点的有Eden 空间、From Survivor 空间、To Survivor 空间等。如果从内存分配的角度看线程共享的Java 堆中可能划分出多个线程私有的分配缓冲区Thread LocalAllocation BufferTLAB。不过无论如何划分都与存放内容无关无论哪个区域存储的都仍然是对象实例进一步划分的目的是为了更好地回收内存或者更快地分配内存。 5、方法区虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分但是它却有一个别名叫做Non-Heap非堆目的应该是与Java 堆区分开来。
对于习惯在HotSpot 虚拟机上开发和部署程序的开发者来说很多人愿意把方法区称为“永久代”Permanent Generation本质上两者并不等价。 6、运行时常量池 运行时常量池Runtime Constant Pool是方法区的一部分。 6、直接内存 直接内存Direct Memory并不是虚拟机运行时数据区的一部分也不是Java虚拟机规范中定义的内存区域但是这部分内存也被频繁地使用而且也可能导致OutOfMemoryError 异常出现 jdk1.7常用的调试命令
1.jps 查看java进程号例如 D:\jdk7\binjps 9616 Jps 4136 org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
上例的 4136 就是java进程号eclispe的 2.jstat -gc 进程号 查看某进程gc情况例如
D:\jdk7\binjstat -gc 4136 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 44544.0 44544.0 0.0 44540.0 268800.0 139260.2 715776.0 105657.3 101376.0 101048.6 3 0.310 0 0.000 0.310
3.jstat -gcutil 进程号 查看某进程gc情况 ,百分比情况
D:\jdk7\binjstat -gcutil 4136 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 99.99 51.81 14.76 99.68 3 0.310 0 0.000 0.3104.jinfo 进程号 查看某进程的java运行期参数 jinfo -flag CMSInitiatingOccupancyFraction 查看指定参数的值5.jmap -dump:formatb,fileeclipse.bin 进程号 dump指定的进程到文件。6. jhat 文件名 分析dump文件生产报告默认访问地址http://localhost:7000/ 7.jvisualvm.exe可视化的java内存分析工具。新一代分析工具功能强大。 增加了gc插件后的界面增加插件的方法 工具-〉插件-〉可用插件-〉Visual GC 但是注意Visual VM分析工具本身也是挺消耗系统性能的。
经验
1.使用Spring 和hibatnatie等框架容易引起永久代”Permanent Generation占满动态代理类的原因
2.使用Apache NIO的类包容易引发直接内存Direct Memory占满。
3.JVM内存并非越大越好32位JVM有时候比64位JVM运行速度更快。如果要消耗机器硬件性能不妨多启动几个Tomcat分别用不同端口。32JVM的内存管理不能超过2GB64位JVM才可以超过4GB。
理论上来说32位的JVM有4G的堆大小限制。但是因为各种条件限制比如交换区内核地址空间使用内存碎片虚拟管理机的管理开销实际上可用的堆的大小远远比理论上的4G要少。 在32位windows的机器上堆最大可以达到1.4G至1.6G。 在32位solaris的机器上堆最大可以达到2G 而在64位的操作系统上32位的JVM堆大小可以达到4G
4.在linux环境下 kill -3 pid 的方式发送一个SIGQUIT信号给Java应用之后通常会有当前的Thread Dump输出。吓唬JVM输出Dump但是服务器环境的 dump动 不动 就是上G的文件即使Dump出来也很难分析。
5.一种土办法是 卸载可能产生问题的模块按个去试试是否会内存溢出。这跟修电脑的原理有点类似。