应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

JVM运行数据区深度解析

  运行数据区
  字节码只是一个二进制文件存放在那里。要想在jvm里跑起来,先得有个运行的内存环境。
  也就是我们所说的jvm运行时数据区。
  1)运行时数据区的位置
  运行时数据区是jvm中最为重要的部分,执行引擎频繁操作的就是它。类的初始化,以及后面我们讲的对象空间的分配、垃圾的回收都是在这块区域发生的。
  2)区域划分
  根据《Java虚拟机规范》中的规定,在运行时数据区将内存细分为几个部分
  线程私有的:Java虚拟机栈(JavaVirtualMachineStack)、程序计数器(ProgramCounterRegister)、本地方法栈(NativeMethodStacks)
  大家共享的:方法区(MethodArea)、Java堆区(JavaHeap)
  接下来我们分块详细来解读,每一块是做什么的,如果溢出了会发生什么事情1。1程序计数器1。1。1概述
  程序计数器(ProgramCounterRegister)每个线程一个。是一块较小的内存空间,它表示当前线程执行的字节码指令的地址。字节码解释器工作时,通过改变这个计数器的值来选取下一条需要执行的字节码指令,所以整个程序无论是分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。由于线程是多条并行执行的,互相之间执行到哪条指令是不一样的,所以每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为线程私有的内存。如果是native方法,这里为空1。1。2溢出异常
  没有!
  在虚拟机规范中,没有对这块区域设定内存溢出规范,也是唯一一个不会溢出的区域1。1。3案例
  因为它不会溢出,所以我们没有办法给它造一个,但是从class类上可以找到痕迹。
  回顾上面javap的反汇编,其中code所对应的编号就可以理解为计数器中所记录的执行编号。
  1。2虚拟机栈
  1。2。1概述也是线程私有的!生命周期与线程相同。它描述的是Java方法执行的当前线程的内存模型,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。1。2。2溢出异常
  1)栈深度超出设定
  如果是创建的栈的深度大于虚拟机允许的深度,抛出
  Exceptioninthreadmainjava。lang。StackOverflowError
  2)内存申请不足
  如果栈允许内存扩展,但是内存申请不够的时候,抛出OutOfMemoryError
  注意!这一点和具体的虚拟机有关,hotspot虚拟机并不支持栈空间扩展,所以单线程环境下,一个线程创建时,分配给它固定大小的一个栈,在这个固定栈空间上不会出现再去扩容申请内存的情况,也就不会遇到申请不到一说,只会因为深度问题超出固定空间造成上面的StackOverflowError
  如果换成多线程,毫无节制的创建线程,还是有可能造成OutOfMemoryError。但是这个和Xss栈空间大小无关。是因为线程个数太多,栈的个数太多,导致系统分配给jvm进程的物理内存被吃光。
  这时候虚拟机会附带相关的提示:
  Exceptioninthreadmainjava。lang。OutOfMemoryError:unabletocreatenativethread
  ps:每个线程默认分配1M空间(64位linux,hotspot环境)
  疑问:是不是改小Xss的值就可以得到栈空间溢出呢?
  答:根据上面的分析,hotspot下不可以,还是会抛出StackOverflowError,无非深度更小了。1。2。3案例一:进出栈顺序
  1)代码packagecom。itheima。jvm。demo;程序模拟进栈、出栈过程先进后出publicclassStackInAndOut{定义方法一publicstaticvoidA(){System。out。println(进入方法A);}定义方法二;调用方法一publicstaticvoidB(){A();System。out。println(进入方法B);}publicstaticvoidmain(String〔〕args){B();System。out。println(进入Main方法);}}
  2)运行结果:进入方法A进入方法B进入Main方法
  3)栈结构:
  main方法B方法A方法
  1。2。4案例二:栈深度溢出
  1)代码
  这个容易实现,方法嵌套自己就可以:packagecom。itheima。jvm。demo;通过一个程序模拟线程请求的栈深度大于虚拟机所允许的栈深度;抛出StackOverflowErrorpublicclassStackOverFlow{定义方法,循环嵌套自己publicstaticvoidB(){B();System。out。println(进入方法B);}publicstaticvoidmain(String〔〕args){B();System。out。println(进入Main方法);}}
  2)运行结果:Exceptioninthreadmainjava。lang。StackOverflowErroratcom。itheima。jvm。demo。StackOverFlow。B(StackOverFlow。java:12)atcom。itheima。jvm。demo。StackOverFlow。B(StackOverFlow。java:12)atcom。itheima。jvm。demo。StackOverFlow。B(StackOverFlow。java:12)atcom。itheima。jvm。demo。StackOverFlow。B(StackOverFlow。java:12)atcom。itheima。jvm。demo。StackOverFlow。B(StackOverFlow。java:12)
  3)栈结构:
  1。2。5案例三:栈内存溢出
  一直不停的创建线程就可以堆满栈
  但是!这个很危险,到32系统的winxp上勇敢的小伙伴可以试一试,机器卡死不负责!packagecom。itheima。jvm。demo;栈内存溢出,注意!很危险,谨慎执行执行时可能会卡死系统。直到内存耗尽publicclassStackOutOfMem{publicstaticvoidmain(String〔〕args){while(true){newThread((){while(true);})。start();}}}1。3本地方法栈1。3。1概述本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法虚拟机规范里对这块所用的语言、数据结构、没有强制规定,虚拟机可以自由实现它甚至,hotspot把它和虚拟机栈合并成了1个1。3。2溢出异常
  和虚拟机栈一样,也是两个:
  如果是创建的栈的深度大于虚拟机允许的深度,抛出StackOverFlowError
  内存申请不够的时候,抛出OutOfMemoryError1。4堆1。4。1概述
  与上面的3个不同,堆是所有线程共享的!所谓的线程安全不安全也是出自这里。
  在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里几乎所有的对象实例都在这里分配内存。
  需要注意的是,《Java虚拟机规范》并没有对堆进行细致的划分,所以对于堆的讲解要基于具体的虚拟机,我们以使用最多的HotSpot虚拟机为例。
  Java堆是垃圾收集器管理的内存区域,因此它也被称作GC堆,这就是我们做JVM调优的重点区域部分。1。4。2jdk1。7
  jvm的内存模型在1。7和1。8有较大的区别,虽然1。7目前使用的较少了,但是我们也是需要对1。7的内存模型有所了解,所以接下里,我们将先学习1。7再学习1。8的内存模型。
  Young年轻区(代)Young区被划分为三部分,Eden区和两个大小严格相同的Survivor区其中,Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用在Eden区间变满的时候,GC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到下面的Tenured区间。Tenured年老区Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young复制转移一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间。Perm永久区hotspot1。6才有这货,现在已经成为历史Perm代主要保存class,method,filed对象,这部份的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java。lang。OutOfMemoryError:PermGenspace的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题。另外一种可能是创建了大批量的jsp文件,造成类信息超出perm的上限而溢出。这种重启也解决不了。只能调大空间。Virtual区:jvm参数可以设置一个范围,最大内存和初始内存的差值,就是Virtual区。1。4。3jdk1。8
  由上图可以看出,jdk1。8的内存模型是由2部分组成,年轻代年老代。永久代被干掉,换成了Metaspace(元数据空间)
  年轻代:Eden2Survivor(不变)
  年老代:OldGen(不变)
  元空间:原来的perm区(重点!)
  需要特别说明的是:Metaspace所占用的内存空间不是在虚拟机内部,而是在本地内存空间中,这也是与1。7的永久代最大的区别所在。
  1。4。4溢出异常
  内存不足时,抛出
  java。lang。OutOfMemoryError:Javaheapspace1。4。5案例:堆溢出
  1)代码
  分配大量对象,超出jvm规定的堆范围即可packagecom。itheima。jvm。demo;importjava。util。ArrayList;importjava。util。List;堆溢出Xms20mXmx20mpublicclassHeapOOM{Byte〔〕bytesnewByte〔10241024〕;publicstaticvoidmain(String〔〕args){ListlistnewArrayList();inti0;while(true){System。out。println(i);list。add(newHeapOOM());}}}
  2)启动
  注意启动时,指定一下堆的大小:
  2)输出12345Exceptioninthreadmainjava。lang。OutOfMemoryError:Javaheapspaceatcom。itheima。jvm。demo。HeapOOM。init(HeapOOM。java:7)atcom。itheima。jvm。demo。HeapOOM。main(HeapOOM。java:13)1。5方法区1。5。1概述
  同样,线程共享的。
  它主要用来存储类的信息、类里定义的常量、静态变量、编译器编译后的代码缓存。
  注意!方法区在虚拟机规范里这是一个逻辑概念,它具体放在那个区域里没有严格的规定。
  所以,hotspot1。7将它放在了堆的永久代里,1。8单独开辟了一块叫metaspace来存放一部分内容(不是全部!定义的类对象在堆里)
  具体方法区主要存什么东西呢?粗略的分,可以划分为两类:类信息:主要指类相关的版本、字段、方法、接口描述、引用等运行时常量池:编译阶段生成的常量与符号引用、运行时加入的动态变量(常量池里的类变量,如对象或字符串,比较特殊,1。6和1。8位置不同,下面会讲到)
  小提示:
  这里经常会跟上面堆里的永久代混为一谈,实际上这是两码事
  永久代是hotspot在1。7及之前才有的设计,1。8,以及其他虚拟机并不存在这个东西。
  可以说,永久代是1。7的hotspot偷懒的结果,他在堆里划分了一块来实现方法区的功能,叫永久代。因为这样可以借助堆的垃圾回收来管理方法区的内存,而不用单独为方法区再去编写内存管理程序。懒惰!
  同时代的其他虚拟机,如J9,Jrockit等,没有这个概念。后来hotspot认识到,永久代来做这件事不是一个好主意。1。7已经从永久代拿走了一部分数据,直到1。8彻底去掉了永久代,方法区大部分被移到了metaspace(再强调一下,不是全部!)
  结论:
  方法区是一定存在的,这是虚拟机规定的,但是是个逻辑概念,在哪里虚拟机自己去决定
  而永久代不一定存在(hotspot1。7才有),已成为历史1。5。2溢出异常
  1。6:OutOfMemoryError:PermGenspace
  1。8:OutOfMemoryError:Metaspace1。5。3案例:1。6方法区溢出
  1)原理
  在1。6里,字符串常量是运行时常量池的一部分,也就是归属于方法区,放在了永久代里。
  所以1。6环境下,让方法区溢出,只需要可劲造往字符串常量池中造字符串即可,这里用到一个方法:如果字符串常量池里有这个字符串,直接返回引用,不再额外添加如果没有,加进去,返回新创建的引用String。intern()
  2)代码方法区溢出,注意限制一下永久代的大小编译的时候注意pom里的版本,要设置1。6,否则启动会有问题jdk1。6:XX:PermSize6MXX:MaxPermSize6MpublicclassConstantOOM{publicstaticvoidmain(String〔〕args){ConstantOOMoomnewConstantOOM();SetStringstringSetnewHashSet();inti0;while(true){System。out。println(i);stringSet。add(String。valueOf(i)。intern());}}}
  3)创建启动环境
  4)异常信息:。。。191181911919120Exceptioninthreadmainjava。lang。OutOfMemoryError:PermGenspaceatjava。lang。String。intern(NativeMethod)atcom。itheima。jvm。demo。ConstantOOM。main(ConstantOOM。java:19)1。5。4案例:1。8方法区溢出
  1)到了1。8,情况发生了变化
  可以测试一下,1。8下无论指定下面的哪个参数,常量池运行都不会溢出,会一直打印下去XX:PermSize6MXX:MaxPermSize6MXX:MetaspaceSize10MXX:MaxMetaspaceSize10M
  2)配置运行环境
  3)控制台信息
  不会抛出异常,只要你jvm堆内存够,理论上可以一直打下去
  4)为什么呢?
  永久代我们加了限制,结果没意义,因为1。8里已经没有这货了
  元空间也加了限制,同样没意义,那说明字符串常量池它不在元空间里!
  那么,它在哪里呢?
  jdk1。8以后,字符串常量池被移到了堆空间,和其他对象一样,接受堆的控制。
  其他的运行时的类信息、基本数据类型等在元空间。
  我们可以验证一下,对上面的运行时参数再加一个堆上限限制:Xms10mXmx10m
  运行环境如下:
  运行没多久,你会得到以下异常:840148401584016840178401884019Exceptioninthreadmainjava。lang。OutOfMemoryError:GCoverheadlimitexceededatjava。lang。Integer。toString(Integer。java:403)atjava。lang。String。valueOf(String。java:3099)atcom。itheima。jvm。demo。ConstantOOM。main(ConstantOOM。java:18)
  说明:1。8里,字符串inter()被放在了堆里,受最大堆空间的限制。
  5)那如何才能让元空间溢出呢?
  既然字符串常量池不在这里,那就换其他的。类的基本信息总在元空间吧?我们来试一下
  cglib是一个apache下的字节码库,它可以在运行时生成大量的对象,我们while循环同时限制metaspace试试:
  附:https:gitee。commirrorscglib(想深入了解这个工具的猛击左边,这里不做过多讨论)packagecom。itheima。jvm。demo;importnet。sf。cglib。proxy。Enhancer;importnet。sf。cglib。proxy。MethodInterceptor;importnet。sf。cglib。proxy。MethodProxy;importjava。lang。reflect。Method;jdk8方法区溢出XX:MetaspaceSize10MXX:MaxMetaspaceSize10MpublicclassConstantOOM8{publicstaticvoidmain(finalString〔〕args){while(true){EnhancerenhancernewEnhancer();enhancer。setSuperclass(OOM。class);enhancer。setUseCache(false);enhancer。setCallback(newMethodInterceptor(){OverridepublicObjectintercept(Objecto,Methodmethod,Object〔〕objects,MethodProxymethodProxy)throwsThrowable{returnmethodProxy。invokeSuper(objects,args);}});enhancer。create();}}staticclassOOM{}}
  6)运行设置
  7)运行结果Causedby:java。lang。OutOfMemoryError:Metaspaceatjava。lang。ClassLoader。defineClass1(NativeMethod)atjava。lang。ClassLoader。defineClass(ClassLoader。java:763)
  结论:
  jdk8引入元空间来存储方法区后,内存溢出的风险比历史版本小多了,但是在类超出控制的时候,依然会打爆方法区1。6一个案例
  为便于大家理解和记忆,下面我们用一个案例,把上面各个区串通起来。
  假设有个Bootstrap的类,执行main方法。在jvm里,它从class文件到跑起来,大致经过如下步骤:
  首先JVM会先将这个Bootstrap。class信息加载到内存中的方法区接着,主线程开辟一块内存空间,准备好程序计数器pc,虚拟机栈、本地方法栈然后,JVM会在Heap堆上为Bootstrap。class创建一个Bootstrap。class的类实例JVM开始执行main方法,这时在虚拟机栈里为main方法创建一个栈帧main方法在执行的过程之中,调用了greeting方法,则JVM会为greeting方法再创建一个栈帧,推到虚拟机栈顶,在main的上面,每次只有一个栈帧处于活动状态,当前为greeting当greeting方法运行完成后,则greeting方法出栈,当前活动帧指向main,方法继续往下运行1。7归纳总结
  1)独享共享的角度:独享:程序计数器、虚拟机栈、本地方法栈共享:堆、方法区
  2)error的角度:程序计数器:不会溢出,比较特殊,其他都会两个栈:可能会发生两种溢出,一是深度超了,报StackOverflowError,空间不足:OutOfMemoryError堆:只会在空间不足时,报OutOfMemoryError,会提示heapSpace方法区:空间不足时,报OutOfMemoryError,提示不同,1。6是permspace,1。8是元空间,和它在什么地方有关
  3)归属:计数器、虚拟机栈、本地方法栈:线程创建必须申请配套,真正的物理空间堆:真正的物理空间,但是内部结构的划分有变动,1。6有永久代,1。8被干掉方法区:最没归属感的一块,原因就是它是一个逻辑概念。1。6被放在了堆的永久代,1。8被拆分,一部分在元空间,一部分(方法区的运行时常量池里面的类对象,包括字符串常量,被设计放在了堆里)直接内存:这块实际上不属于运行时数据区的一部分,而是直接操作物理内存。在nio操作里DirectByteBuffer类可以对native操作,避免流在堆内外的拷贝。我们下一步的调优不会涉及到它,了解即可。

难怪被称为洗洁精,陈数穿花又戴金,却不艳俗,气质没法装这个世上从不缺美女,但大多都如尔冬升所说;美则美矣,没有性格。乍一看漂亮,没有什么辨识度,过眼即忘。陈数是较为独特的一个,论年龄,45岁的她在娱乐圈并没有太大优势;论身材……官方广州队又一老臣回归,辅助郑智搭建教练团队广州队日前从大连返回广州,郑智再次以主帅身份带队出现在公众视野,令不少球迷倍感欣慰。在队中十几年,郑智的人格魅力能感染一众队友,当年的不少老队友,如今都愿意回到他身边,辅助郑智……院子,才是最大的奢侈封面图物道物道君语:疫情之下,小院有了不同的意义。人人都知道,在我们这个时代,拥有一个院子是奢侈的。但尽管如此,院子对我们的诱惑,我们对院子的向往,未曾减少一……新疆VS浙江!阿不都朱旭航虎口拔牙,余嘉豪PK法尔新疆队3胜1负,超出预期在对阵宁波队的比赛中,队长阿不都沙拉木终于复出了,替补出场打了18分钟,7投4中得到9分3篮板2助攻,中规中矩。战胜宁波队后,4轮比赛打完,新疆队……10个脑梗患者,至少9个是作出来的,给血管添堵的行为,尽量少据《柳叶刀》公布的数据来看,中国的新发脑梗病例已经达到551万,而全球的新发脑梗病例是1370万,这样算来,中国的脑梗人群就快要占到一半了。中国的脑梗患病人群为何越来越多……杨幂发型太美不像医生?谢谢你医生能走出医疗剧悬浮困境吗工作这么忙,女医生会编发、烫发吗?不要标签化医生,年轻医生也爱美由杨幂、白宇领衔主演的医疗情感关怀剧《谢谢你医生》在央八、腾讯、爱奇艺刚开播不久,网友们就为了剧中杨幂饰演的肖砚……比肩ModelY,29。99万续航605km,奥迪Q4etr随着造车新势力特斯拉、蔚来、理想等车企涌入,现在的新能源市场是如火如荼。在当前经济形势下,新能源需求反而大增,甚至部分车企出现供不应求的状况。可谓是内行人看门道,外行人看热闹。……不是夫妻关系的人可以同住酒店一间房吗?前台注意这几点就可以现如今小伙伴们外出游玩的机会是越来越多了,其中有些人选择到外地旅游观光,也有部分小伙伴选择到外地出差。(此处已添加小程序,请到今日头条客户端查看)不过对于大众来说,来到异……儿子曾是不能说的秘密,46岁陈坤一直未婚,他一直没有逃避当年华晨宇一句官宣是的,我们有了一个孩子,将娱乐圈炸出一番水花,各大粉丝纷纷震惊不已。娱乐圈这种经常出现孩子的事情可不少,前段时间的王子文也主动坦白自己有一个儿子,但是并……唐嫣,要么离婚,要么退圈娱评大赏大家有没有发现,近期85花好活跃啊。前几天才捆绑上了热搜,85花热门女演员梯队图引起众多讨论。这个话题出来,多少有点比较的意思。而当85花被比较……抗日神剧专业户四大女演员的没落史,糊成这样,该怪谁呢?2020年抗战剧《雷霆战将》打着《亮剑3》的旗号播出后迅速引起了全网关注,剧中主演们梳着油光锃亮的大背头、喝着咖啡、抽着雪茄、撩着妹、耍着帅,顺带着打个仗的种种辱没英烈的神剧设……十月吃好,入冬不恼,若有条件常吃2谷3鲜,正应季营养足再过不久,霜降就要到了。随着天气由凉转寒,人们也都纷纷穿上了厚衣服保暖。而想要抵御寒潮,让秋冬度过地更顺利,除了增添衣物,平常的饮食也需要格外重视。俗话说十月吃好,入冬不……
纳豆是什么味道(买的纳豆里的两包调料是什么)说到具有中毒性的日本特色食物,小可爱萌第一个想到什么呐?()菜包酱想到了纳豆!纳豆可以说是一种非常神奇的存在了。爱它的人像中毒般,每顿饭仿佛无纳豆不欢()。……衣蛾幼虫怎么消灭(为什么墙上会有衣蛾幼虫)家里出现衣蛾,就说明家里一定会有衣蛾的窝。因为衣蛾是群居卵生的动物,而衣蛾的窝不仅是给衣蛾生活,而且还是衣蛾生幼虫的地方。所以家里一旦出现衣蛾,一定要找到衣蛾的窝,……建议中老年人该花钱时就花,这3种高营养食品越吃越年轻不知道大家有没有这样的感受,到了中年以后,自己为自己花钱却变得越来越抠门,恨不得把1分钱掰成两半花,而为家里人花钱却眼都不眨一下,这是绝大多数当代普通中老年人的真实写照。……股票一手等于多少股(一手股票等于多少股份)相信很多刚刚接触股市的小白投资者,对于股市中的一些专业名词还不是很熟悉。在杂谈金融之前的文章中,有和大家分享过股市的一些基础知识。下面,再来和大家分享下,股市中,一手股票代表了……什么是跳蛋(会跳舞的鸡蛋作文网。net)回京的火车上,我又一次打开了《摔跤吧!爸爸!》,看着看着,内心越来越沉重,抬起疲惫的双眼,透过朦胧的车窗,哪些在寒风中像哨兵似的杨树,犹如倔强的Geeta姐妹,绝不向命运低头。……人为什么会害怕(人为什么天生害怕一些东西)每个人都可能害怕生活中的某些事情,这似乎是一种人性。就是怕多恶,不怕天地的恶人,有时也会害怕。比如,他们害怕鬼神,害怕受到正义的惩罚。但这只是一种社会和文化上的恐惧。相比之下,……哪里有粘土(野外怎么区分粘土和粉质粘土)一、粘性土粘性土分为粉质粘土和粘土一、粉质粘土定义:塑性指数大于10且小于或等于17的土应定名为粉质粘土,肉眼观察,细土中有砂粒,干时不坚硬,用锤可打成细土粒,湿时……垃圾桶怎么画(漂亮的垃圾桶怎么画)扬子晚报网4月12日讯(通讯员王莹菲记者梅建明)4月11日下午,南京市玄武区红山街道开展红色引领绿色践行垃圾分类的主题活动。在此次活动中,十多位多才多艺的小朋友们,亲手绘制彩绘……科技杂志有哪些(科技方面有哪些报刊)28。905!6月30日晚,国际权威机构科睿唯安发布2021期刊引证报告(JCR),去年8月被SCIE正式收录的上海期刊《电化学能源评论(英文)》以高达28。905的影响因子创……怎么走路有气质(女孩走路姿势好看窍门)优雅女人的美,有静态的娴静美,也有动态的灵动美,而优美的走姿最好地诠释了女人的动态美。如果走路时摇摇晃晃或者步履迟缓,纵使华服在身也毫无美感。一个真正优雅的女人,即使与人擦身而……长沙市加强茶油生产加工培训,护航油茶产业高质量发展湖南日报新湖南客户端3月30日讯(记者谢璐通讯员黄莞莞)为加大推进茶油产业品质建设,全面提高茶油生产加工小作坊实施主体的质量安全管理水平,今天,长沙市林业局举办茶油生产加工小作……教你怎样正确服用印度必利劲效果最好男人在快节奏的生活中,压力越来越大,总是感觉身体被掏空,而且给爱人的性福总是打折扣,草草了事。这时候就需要服用印度必利劲来给你加油跑长途,下面给大家分享一下怎样服用印度必利劲才……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网