关于Jvm的见解
Posted anonymityning
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Jvm的见解相关的知识,希望对你有一定的参考价值。
栈管运行,堆管存储!!!
栈呢,也叫作栈内存,主要管java程序的运行,在线程创建时创建,生命周期和线程一致,只要线程一结束,该栈就被GC,是线程私有的。基本类型的变量和对象的引用数据类型的变量都在栈内存中调用。
栈存储什么?
大体可以分为3类:
1.本地变量:输入参数和输出参数以及方法付内的变量
2.栈操作:记录入栈、出栈的操作
3.栈帧数据:包括类文件、方法等等
栈运行原理
栈中的数据都是以栈帧的格式存在,当存储一个数据时,产生一个栈帧F1,并且被压入了栈中;其实再存入数据时,会再产生一个栈帧F2,也被压入了栈中。。。。。执行完毕时,后被压入栈中的数据会先被弹出,符合“先进后出,后进先出”原则。
静态方法存储在方法区,跑到栈区,只是在运行时,临时跑过去,类似于你请人来家里帮忙,但是这个人并不是你家里的人。
jvm优化主要是共享的数据区即方法区和堆中。
JVM分类
Sun公司的Hotpot(平时最常用)
BEA公司的JRockit
IBM公司的J9 VM
BEA公司最有名的产品是WebLogic, Web服务器,比tomcat性能高很多倍!
伊甸区(占内存的约80%):
程序运行时,所有的数据,当达到70%时,程序会运行GC垃圾回收机制,其实没有被调用的数据就会被回收,若是被调用则会存储到幸存者0区。
幸存者0区(占内存的约10%):
在伊甸区中,没有被GC回收的数据会被保存在这里。
幸存者1区(占内存的约10%):
经过伊甸区和幸存者0区再次回收时,未被回收时,如果0区满了,则存放在这里。
养老区:
如果数据在幸存者1区也满了的话,则会放到养老区。如果养老区也存放满了,则会报程序溢出异常。一般池对象在这个区域活跃。养老区的对象一般是活过15次以上的(jdk1.6之前),现在可以随意修改参数,最多不可以超过31次
一般来说,虚拟机的内存只能达到内存的1/4
可是使用: Runtime.getRuntime().maxMemory()/1024/1024 得到最大的内存
养老区的对象 调优:过大的jvm 内存的开销,而且对象的大量存活,不一定就会进入老年区;因为我们可以设置survivor和Eden的大小;以及可以设置threshold的值。threshold设置高一点(比如30),然后Eden设置8G,survivor设置500M.
永久存储区:
是一个常驻内存区域,存放的都是运行时,所需要的jar包,例如:Tomcat运行时,必须要jre中的jar包。用于存放元数据,并不会被垃圾回收机制回收,当程序结束运行时,关闭虚拟机才会释放。
常量池:
存放的是一些常量,不可改变的数据。例如 String a = "hello" hello就放在常量池中。
以上是关于关于Jvm的见解的主要内容,如果未能解决你的问题,请参考以下文章