范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

面试必问说一下Java虚拟机的内存布局?

  我们通常所说的 Java 虚拟机(JVM)的内存布局,一般是指 Java 虚拟机的运行时数据区(Runtime Data Area),也就是当字节码被类加载器加载之后的执行区域划分。当然它通常是 JVM 模块的第一个面试问题,所以,接下来我们一起来看它里面包含了哪些内容。官方定义
  《Java虚拟机规范》中将 JVM 运行时数据区域划分为以下 5 部分:程序计数器(Program Counter Register)Java虚拟机栈(Java Virtual Machine Stacks)本地方法栈(Native Method Stack)Java 堆(Java Heap)方法区(Methed Area)
  如下图所示:
  接下来,我们分别来看每个模块的作用及详细介绍。1.程序计数器
  《Java虚拟机规范》中对程序计数器的定义如下:
  The Java Virtual Machine can support many threads of execution at once (JLS §17). Each Java Virtual Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method (§2.6) for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native, the value of the Java Virtual Machine"s pc register is undefined. The Java Virtual Machine"s pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.
  以上内容翻译成中文,简单来说它的含义是:JVM 中可以有多个执行线程,每个线程都有自己的程序计数器,在程序计数器中包含的是正在执行线程的指令地址。
  也就是说,程序计数器(Program Counter Register)是线程独有一块很小的内存区域,保存当前线程所执行字节码的位置,包括正在执行的指令、跳转、分支、循环、异常处理等。1.1 作用
  我们知道,CPU 核数是比较少的,而任务(线程)是比较多的,所以真实的情况是,CPU 会不停的切换线程以执行所有的程序,当然因为(CPU)切换的速度比较快,所以我们是感知不到的,我们感觉好像所有的程序都是一直在执行,其实从微观的层面来看,所有的程序都是切换执行的。
  那么问题来了,CPU 一直在切换线程执行任务,那 CPU 再次切换到某个线程时,它是怎么知道当前的线程上次知道到哪了?
  这就是程序计数器的作用,程序计数器里面保存了当前线程执行的行号,这样当 CPU 切换到当前线程时,才能接着上次执行的位置,继续执行。
  PS:程序计数器中真实记录的是下一行任务的执行指令。程序计数器也是 JVM 运行时数据区中执行最快的一块区域。1.2 线程共享
  程序计数器记录的是每个线程的执行行号,所以每个线程都拥有自己的程序计数器,所以此区域不是线程共享的,而是线程私有的。1.3 GC
  GC 是 Garbage Collection 的缩写,译为垃圾收集。
  此区域不存在 GC。1.4 OOM
  OOM 是 Out of Memory 的缩写,译为内存溢出。
  此区域不存在 OOM 的问题。2.Java 虚拟机栈
  Java 虚拟机栈(Java Virtual Machine Stack)也叫做 JVM 栈,《Java虚拟机规范》对此区域的说明如下:
  Each Java Virtual Machine thread has a private  Java Virtual Machine stack , created at the same time as the thread. A Java Virtual Machine stack stores frames ( §2.6). A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return. Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.
  In the First Edition of The Java® Virtual Machine Specification, the Java Virtual Machine stack was known as the Java stack.
  This specification permits Java Virtual Machine stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the Java Virtual Machine stacks are of a fixed size, the size of each Java Virtual Machine stack may be chosen independently when that stack is created.
  A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of Java Virtual Machine stacks, as well as, in the case of dynamically expanding or contracting Java Virtual Machine stacks, control over the maximum and minimum sizes.
  The following exceptional conditions are associated with Java Virtual Machine stacks: If the computation in a thread requires a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a StackOverflowError. If Java Virtual Machine stacks can be dynamically expanded, and expansion is attempted but insufficient memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java Virtual Machine stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.
  以上内容翻译成中文的含义如下:
  Java 虚拟机栈是线程私有的区域,它随着线程的创建而创建。它里面保存的是局部变量表(基础数据类型和对象引用地址)和计算过程中的中间结果。Java 虚拟机的内存不需要连续,它只有两个操作:入栈和出栈。
  Java 虚拟机栈要么大小固定,要么根据计算动态的扩展和收缩。程序员可以对 Java 虚拟机栈进行初始值的大小设置和最大值的设置。
  Java 虚拟机栈出现的异常有两种:当 Java 虚拟机栈大小固定时,如果程序中的栈分配超过了最大虚拟机栈就会出现 StackOverflowError 异常。如果 Java 虚拟机栈是动态扩展的,那么当内存不足时,就会引发 OutOfMemoryError 的异常。2.1 作用
  Java 虚拟机栈主要是管 Java 程序运行的,它保存的是方法的局部变量、方法执行中的部分结果,并参与方法的调用和返回。
  简单来说,栈是运行时单位,而堆是存储单位。也就是说:栈解决的是程序运行的问题,即程序如何执行?或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放?放在哪儿。2.2 线程共享
  Java 虚拟机栈是线程私有的,它的生命周期和线程的生命周期一致。2.3 GC
  Java 虚拟机栈因为只有入栈和出栈两个操作,所以它是不涉及垃圾回收的。2.4 OOM
  此区域虽然没有 GC,但存在两种异常:当 Java 虚拟机栈大小固定时,如果程序中的栈分配超过了最大虚拟机栈就会出现 StackOverflowError 异常。如果 Java 虚拟机栈是动态扩展的,那么当内存不足时,就会引发 OutOfMemoryError 的异常。
  也就是,Java 虚拟机栈是可能存在 OOM 的。2.5 常见参数设置
  设置 Java 虚拟机栈大小:-Xss。
  如设置:-Xss128k,表示设置每个线程的栈大小为 128k,此设置等价于 -XX:ThreadStackSize=128k。2.6 常见问题演示
  最简单的错误示例就是死循环,方法自己调自己,这样 Java 虚拟机栈就会只入栈不出栈,当到达 Java 虚拟机栈的最大数之后就会出现 StackOverflowError 异常,如下图所示:
  3.本地方法栈
  本地方法栈(Native Method Stacks),《Java 虚拟机规范》对此区域的说明如下:
  An implementation of the Java Virtual Machine may use conventional stacks, colloquially called "C stacks," to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine"s instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created.
  This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created.
  A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the native method stacks, as well as, in the case of varying-size native method stacks, control over the maximum and minimum method stack sizes.
  The following exceptional conditions are associated with native method stacks: If the computation in a thread requires a larger native method stack than is permitted, the Java Virtual Machine throws a StackOverflowError. If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.
  以上内容,挑重点简单翻译一下:本地方法栈俗称"C栈",它是 Native(本地)方法(用 Java 编程语言以外的语言编写的方法),此区域和 Java 虚拟机栈类似,这不过诸如 C 语言等使用的栈空间。它也是存在两种异常:StackOverflowError 和 OutOfMemoryError。
  PS:因为此区域是非 Java 语言实现和使用的,所以本文就不做过多的赘述,总之,记得一句话:此区域和 Java 虚拟机栈类似,不过是给 C/C++ 语言使用的。4.堆
  堆(Heap)《Java 虚拟机规范》对此区域的说明如下:
  The Java Virtual Machine has a  heap  that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated.
  The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a  garbage collector ); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor"s system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous.
  A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the heap, as well as, if the heap can be dynamically expanded or contracted, control over the maximum and minimum heap size.
  The following exceptional condition is associated with the heap: If a computation requires more heap than can be made available by the automatic storage management system, the Java Virtual Machine throws an OutOfMemoryError.
  以上内容,挑重点简单翻译一下:
  堆是线程共享的,程序中所有类实例和数组的内存都存储在此区域,它在 Java 虚拟机启动时就会创建。对象不会被显式释放,只会在垃圾收集时释放。堆的大小可以是固定的,也可以动态扩展或收缩。堆的内存在物理层面不需要是连续的。
  程序员可以对堆进行初始大小控制,或者设置最大、最小堆的容量。
  堆可能会出现 OutOfMemoryError 异常。4.1 作用
  堆是 Java 虚拟机的主要存储单位,Java 中所有的对象和数组都是保存在此区域的。4.2 线程共享
  堆是线程共享的,堆上的对象可能被多个线程同时访问。4.3 GC
  堆是 JVM 最大的一块区域,也是垃圾回收器进行垃圾回收最频繁的一块区域。4.4 OOM
  当堆空间不足时,会发生 OutOfMemoryError 异常。4.5 常见参数设置-Xms:设置初始 Java 堆大小,比如:-Xms10m,表示设置堆的初始大小为 10MB。-Xmx:设置最大 Java 堆大小,比如:-Xmx10m,表示设置堆的最大空间为 10MB。4.6 常见问题演示
  接下来,我们来演示一下堆空间 OOM 的问题,我们先使用"-Xmx50m"的参数来设置一下 Idea,它表示将程序运行的最大内存设置为 50m,如果程序的运行超过这个值就会出现内存溢出的问题,设置方法如下:
  设置后的最终效果这样的:
  PS:因为我使用的 Idea 是社区版,所以可能和你的界面不一样,你只需要点击"Edit Configurations..."找到"VM options"选项,设置上"-Xmx50m"参数就可以了。
  配置完 Idea 之后,接下来我们来实现一下业务代码。在代码中我们会创建一个大对象,这个对象中会有一个 10m 大的数组,然后我们将这个大对象存储在 ThreadLocal 中,再使用线程池执行大于 5 次添加任务,因为设置了最大运行内存是 50m,所以理想的情况是执行 5 次添加操作之后,就会出现内存溢出的问题,实现代码如下:import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;  public class ThreadLocalOOMExample {          /**      * 定义一个 10m 大的类      */     static class MyTask {         // 创建一个 10m 的数组(单位转换是 1M -> 1024KB -> 1024*1024B)         private byte[] bytes = new byte[10 * 1024 * 1024];     }          // 定义 ThreadLocal     private static ThreadLocal taskThreadLocal = new ThreadLocal<>();      // 主测试代码     public static void main(String[] args) throws InterruptedException {         // 创建线程池         ThreadPoolExecutor threadPoolExecutor =                 new ThreadPoolExecutor(5, 5, 60,                         TimeUnit.SECONDS, new LinkedBlockingQueue<>(100));         // 执行 10 次调用         for (int i = 0; i < 10; i++) {             // 执行任务             executeTask(threadPoolExecutor);             Thread.sleep(1000);         }     }      /**      * 线程池执行任务      * @param threadPoolExecutor 线程池      */     private static void executeTask(ThreadPoolExecutor threadPoolExecutor) {         // 执行任务         threadPoolExecutor.execute(new Runnable() {             @Override             public void run() {                 System.out.println("创建对象");                 // 创建对象(10M)                 MyTask myTask = new MyTask();                 // 存储 ThreadLocal                 taskThreadLocal.set(myTask);                 // 将对象设置为 null,表示此对象不在使用了                 myTask = null;             }         });     } }
  以上程序的执行结果如下:
  从上述图片可看出,当程序执行到第 5 次添加对象时就出现内存溢出的问题了,这是因为设置了最大的运行内存是 50m,每次循环会占用 10m 的内存,加上程序启动会占用一定的内存,因此在执行到第 5 次添加任务时,就会出现内存溢出的问题。5.方法区
  方法区(Method Area)《Java 虚拟机规范》对此区域的说明如下:
  The Java Virtual Machine has a  method area  that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods ( §2.9) used in class and instance initialization and interface initialization.
  The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it. This specification does not mandate the location of the method area or the policies used to manage compiled code. The method area may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger method area becomes unnecessary. The memory for the method area does not need to be contiguous.
  A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the method area, as well as, in the case of a varying-size method area, control over the maximum and minimum method area size.
  The following exceptional condition is associated with the method area: If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an OutOfMemoryError.
  以上内容,挑重点简单翻译一下:
  方法区是线程共享的,方法区类似于传统语言的编译代码的存储区,或者类似于操作系统进程中的"文本"段。它存储每个类的结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码。
  方法区域是在 Java 虚拟机启动时创建的,尽管方法区域在逻辑上是堆的一部分,但简单的实现可能选择不进行垃圾收集或压缩。方法区域可以是固定的大小,也可以动态扩展。方法区的(物理)内存不需要连续。
  Java 虚拟机实现可以为程序员或用户提供对方法区域初始大小的控制,以及在可变大小的方法区域的情况下,对最大和最小方法区域大小的控制。
  如果方法区中的内存无法满足分配请求,Java 虚拟机将抛出一个 OutOfMemoryError。5.1 作用
  用于存储每个类的结构,包括运行时常量池、静态变量、字段和方法数据。5.2 HotSpot 方法区实现
  HotSpot 虚拟机是 Sun JDK 和 Open JDK 中自带的虚拟机,也是目前使用范围最广的 Java 虚拟机。作为官方 Java 虚拟机的化身,目前所讲的所有知识,几乎都是针对此虚拟机的,所以我们要看 HotSpot 虚拟机对《Java 虚拟机规范》中方法区的实现。
  对于 HotSpot 虚拟机来说,不同的 JDK 方法区的实现是不同的,在 JDK 1.7 之前,HotSpot 技术团队使用的是永久代来实现方法区的,但这种实现有一个致命的问题,这样设计更容易造成内存溢出。因为永久代有 -XX:MaxPermSize(方法区分配的最大内存)的上限,即使不设置也会有默认的大小。例如,32 位操作系统中的 4GB 内存限制等,并且这样设计导致了部分的方法在不同类型的 Java 虚拟机下的表现也不同,比如 String::intern() 方法。所以在 JDK 1.7 时 HotSpot 虚拟机已经把原本放在永久代的字符串常量池和静态变量等移出了方法区,并且在 JDK 1.8 中完全废弃了永久代的概念。
  JDK 1.8 之后,HotSpot 虚拟机开始使用元空间(Meta Space)来实现方法区了。5.3 线程共享
  方法区是线程共享的。5.4 GC
  《Java 虚拟机规范》中规定方法区可以没有 GC(垃圾回收),但 HotSpot 中对此区域实现了 GC 操作。5.5 OOM
  方法区是存在 OOM 情况的,比如在 JDK 1.8 中,如果元空间设置空间过小,而类信息产生的过多就会产生 OOM,如下示例所示:import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method;  /**  * 方法区 OOM 演示(JDK 1.8+)  * 设置 -XX:MaxMetaspaceSize=10m 元空间最大内存为 10MB。  */ public class MethodAreaOOMExample {     public static void main(String[] args) {         while (true) {             Enhancer enhancer = new Enhancer();             enhancer.setSuperclass(MethodAreaOOMExample.class);             enhancer.setUseCache(false);             enhancer.setCallback(new MethodInterceptor() {                 @Override                 public Object intercept(Object object, Method method,                                         Object[] args,                                         MethodProxy methodProxy) throws Throwable {                     return methodProxy.invokeSuper(object, args);                 }             });             enhancer.create();         }     } }
  以上程序的执行结果如下图所示:
  以上代码是通过 CGLIB 不断的产生动态代理类将方法区填满,从而就导致 OOM 的问题。
  PS:在使用 CGLIB 之前,需要现在当前项目中导入 CGLIB 才可以正常使用。5.6 常用参数设置
  永久代(HotSpot 虚拟机,JDK 1.7 之前设置有效):-XX:PermSize=100m:设置永久代初始值为 100MB。-XX:MaxPermSize=100m:设置永久代最大值为 100MB。
  元空间(HotSpot 虚拟机,JDK 1.8 之后设置有效):-XX:MetaspaceSize=100m:设置元空间初始大小为 100MB。-XX:MaxMetaspaceSize=100m:设置元空间最大容量为 100MB,默认不设置,则没有限制。-XX:CompressedClassSpaceSize=100m:设置 Class Metaspace 的大小为 100MB,默认值为 1G。
  直接内存(HotSpot 虚拟机,JDK 1.8 之后设置有效):
  -XX:MaxDirectMemorySize=100m:指定直接内存的最大容量为 100MB。总结
  《Java虚拟机规范》中将 JVM 运行时数据区域划分为以下 5 部分:程序计数器(Program Counter Register);Java 虚拟机栈(Java Virtual Machine Stacks);本地方法栈(Native Method Stack);Java 堆(Java Heap);方法区(Methed Area)。
  其中线程私有的区域是:程序计数器、Java 虚拟机栈、本地方法栈;而线程共享的是:Java 堆和方法区。
  而除了程序计数器,其他区域都是可以会出现 OOM 的。参考 & 鸣谢
  docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.1
  zhuanlan.zhihu.com/p/518151056

斯诺克最新世界排名出炉赵心童仍居中国选手首位丁俊晖跌至第38名中新社北京10月24日电北京时间24日晨,2022年斯诺克北爱尔兰公开赛落幕,斯诺克最新世界排名也随之出炉。位居第8的赵心童依然排名中国球员之首,中国台球一哥丁俊晖跌至第38名。7恭喜!女排又一女神级选手晋升为人母,宝宝呆萌可爱笑容甜美距离2022年女排超级联赛开打的时间越来越近,各大俱乐部也正积极备战,时刻准备迎接比赛的到来。相比于往年不同的是,新赛季的联赛将不再限制外援,条件上有了很大的放宽,为此辽宁,山东,处于低谷期,你们是怎样挺过来的?遇到人生低谷期该怎么度过,就是按照我的经验来说,就是熬着,好像也只能熬着,但是呢,我今天看到了一个兄弟的回答,他说得更透彻,他的答案是混着。什么叫混着?就像是荒地的野草被千百般的蹂利物浦处于引进姆巴佩的领先位置愿为他付1。5亿镑利物浦皇家马德里曼城曼联和切尔西是对姆巴佩感兴趣的俱乐部。据太阳报报道,在这五家豪门俱乐部中,最可能签下姆巴佩的是利物浦和皇马。在法国,媒体认为利物浦处于签姆巴佩的杆位,这位巴黎前做到了这一点,别人就会尊敬自己我的表弟最近很苦恼,原因是感觉自己很普通,和人相处没有自信,畏畏缩缩,感觉别人都看不起自己。连谈女朋友的勇气也没有。整个人这段时间都不好,加上这几天疫情严重,工作又丢了,更加抑郁了马尔卡宁3112奥利尼克准绝杀爵士加时力克鹈鹕获三连胜NBA常规赛10月24日继续进行,最终,爵士以122121战胜鹈鹕。首节开始,克拉克森连拿5分帮助爵士106开局,随后英格拉姆和锡安合力打出60反超比分。随后鹈鹕这边接连有得分进账广东战宁波!杜锋大练兵继续重用2米26神塔阿联休战宏远冲三连胜昨天CBA第六轮,广东宏远大胜天津男篮,取得了2连胜,目前球队在积分榜已经上升到第9位。更为重要的是,广东宏远年轻球员在比赛中展现出不俗的竞技状态,徐昕张明池徐杰曾茂洲等新锐球员的拒绝17分大逆转!火箭弃将加时送准绝杀,重建鱼腩豪取3连胜北京时间10月24日,NBA常规赛继续进行,爵士122121击败鹈鹕。马尔卡宁首节轰下14分,帮助爵士取得2分领先,次节英格拉姆伤退,爵士趁势将比分扩大到10分,第三节鹈鹕艰难追回到底谁要文班亚马啊湖人保留三巨头3连败爵士送走双核3连胜这个休赛期,有不少球队都开始大肆清洗,开启重建按钮,目的就是要去争夺状元签,争取在明年选秀大会上摘下文班亚马这个天才球员。过去几个赛季一直都是西部季后赛常客的爵士,便是这样一支典型写给7岁女儿的一封信,以后每一年生日都要写一封留作纪念回忆写给7岁的方梓晨亲爱的小可爱你好,从今天起你就7岁了,2我是多么幸运啊,能成为你的麻麻,感谢2555天前的今天,你选择了我,让我们做一生的母女。这是麻麻给你写的第一封信,想说的很多瓜迪奥拉希望哈兰德能在曼城打破英超金靴纪录瓜迪奥拉说,哈兰德绝对可以打破本赛季英超金靴的记录。哈兰德代表曼城在英超联赛的前11次出场中打进了17球,周六对阵布莱顿的梅开二度让他超越了蓝军上赛季的最佳射手,而哈兰德现在距离上
为啥你的搭配总是普通?没搞懂这3点时尚穿搭经,难怪不洋气想要借助搭配提升魅力,快速摆脱土气,我们的搭配就不可以太随意,一个真正有气质的女人,可不会在搭配的时候随意跟风,当你们在冬季想要找到一种能保暖还很时髦的搭配,或许你们就可以看看下面永恒的记忆时光不会为任何人停留,但是记忆,却能够永恒。人生是一段精彩纷呈的旅程,这其中,势必会存在曲折和坎坷,昂扬的基调中也会存在不愉快的插曲。一个人从出生开始,就会被血浓于水的亲情紧紧包裹阿兰德波顿的八大生活规则阿兰德波顿是生活学派的创始人,同时也是哲学家作家和小说家。他提出的八大生活规则,可以帮助人们找到人生的意义,过上充实幸福的生活!人生学校的八条规则1。接受不完美ACCEPTIMPE沈腾和马丽现实中是一种怎样的感情?最近迷上了一句话你一定要站在你所热爱的世界里,闪闪发亮。无论是友情还是爱情,都需要各自努力,跟得上对方的节奏,才能有共同的话题,才能有共同的追求,才能配得上对方。老友记里有句经典台幸福是什么?幸福,不是衣锦玉食,腰缠万贯,不是荣华富贵,不是开好车,住别墅!幸福是哭的时候有人疼,累的时候有人靠,是每一个小小的愿望,有人给你实现,是拥有一个爱自己懂自己的人,不管他有多少,总既过不恋,活在当下2022年已经悄无声息的过去,已经是去年了。去年的无奈,去年的烦恼,登高娱情,随风而去,不过度反省自己,才能打下快乐的基础。去年的成功,去年的得意,去年的辉煌,回眸的惊喜,定格的瞬年是红红的祈福年是一个奇特的传说,这个传说从遥远的古老走来。传说中的那个凶猛恶煞的怪兽在爆竹声声中惊恐,在点燃的火光中离开了村庄,乡村安宁得福了,那红红的火光点燃了福祥,温暖了时光,照亮了快乐。为什么日本女性很少得妇科病呢?医生或与这3种生活习惯有关系妇科问题,是令很多女性非常头痛的一个问题,我国女性出现妇科问题的几率是比较多的,根据统计显示,有超过百分之七十的已婚妇女,受到了妇科方面的问题困扰。更为扎心的是,发病率还在不断的上小白鞋牛仔裤小白鞋过膝裙,才是春天该有的打扮,时髦减龄相信大多数女人都有这样一个通病每次出门逛街都是看一件喜欢一件,并且只看重单品的款式和性价比,不注重面料的质量就买了下来,往往是穿一两次就放在衣橱里面不愿再穿。我们要清楚,有的衣服看冬去春来,少不了一条白色裤子!时髦亮眼,谁见都夸好看裤子可以说是日常穿搭中出场率最高的下装种类,对身材有很好的修饰效果,同时还可以驾驭各种风格的造型。不过裤子的种类十分多样化,而每年的流行趋势也大不相同,要想打破路人感,我们就需要在日本美妆巨头POLA推出新款美白饮,10天快速提亮肌肤随着春夏季节的即将到来,紫外线强度逐渐提升,大家的美白需求又啜啜啜的上来了。趁着这大好时光,日本美妆巨头POLA推出新款美白饮。IXS图源httpswww。pola。co。jpco