
JVM虚拟机
文章平均质量分 87
AlbenXie
这个作者很懒,什么都没留下…
展开
-
Tomcat优化
通过上述的测试,可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。转载 2023-07-01 20:59:56 · 171 阅读 · 0 评论 -
Java启动参数、调优及分析
java启动参数共分为三类;其一是(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;其二是(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;其三是(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;一、标准参数参数描述-client设置jvm使用client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者PC应用开发和调试-server。转载 2023-06-30 21:22:22 · 2020 阅读 · 0 评论 -
JVM -Xms -Xmx -Xmn -Xss
常见配置汇总堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 -XX:MaxPermSize转载 2022-03-25 22:07:07 · 249 阅读 · 0 评论 -
如何降低 young gc 时间
基础知识young gc 主要采用的是copying GC算法;copying GC算法主要有以下两个步骤: Root Scanning Object Copy copying Gc的执行过程大概是从 Gc roots开始扫描其引用,扫描到的就是认为是存活的对象,其他的就是不需要的对象,然后把存放对象进行移动就OK了。young gc 的耗时也基本上都在这两个步骤上。要想减少一次young gc的时间,必须想办法减少上面两步耗时。根据官方文档可以知道,GC roots 包转载 2020-11-09 14:39:10 · 1642 阅读 · 0 评论 -
关于类加载的一些常见错误
最近在做类隔离相关的一些工作,而恰恰之前协助开发同学时也发现会遇到许多类加载相关的异常,并且往往比较难定位与解决。这里简单做一个小总结。类加载首先我们来捋一捋类加载的基础知识。以上是大家比较熟悉的类加载器模型,主要包含 3 种类加载器:BootstrapClassloader 根加载器,也就是系统类加载器,加载核心库,如 rt.jar。 ExtensionClassloader 扩展类加载器,主要加载/ext/下面的 jar 包 AppClassloader 离我们最近的类加载器,负责加载转载 2020-09-22 19:44:58 · 731 阅读 · 0 评论 -
三 实战:第09讲:案例实战:面对突如其来的 GC 问题如何下手解决
本课时我们主要从一个实战案例入手分析面对突如其来的 GC 问题该如何下手解决。想要下手解决 GC 问题,我们首先需要掌握下面这三种问题。如何使用 jstat 命令查看 JVM 的 GC 情况? 面对海量 GC 日志参数,如何快速抓住问题根源? 你不得不掌握的日志分析工具。工欲善其事,必先利其器。我们前面课时讲到的优化手段,包括代码优化、扩容、参数优化,甚至我们的估算,都需要一些支撑信息加以判断。对于 JVM 来说,一种情况是 GC 时间过长,会影响用户的体验,这个时候就需要调整某些 J原创 2020-06-28 18:08:03 · 627 阅读 · 1 评论 -
二 垃圾回收:第08讲:案例实战:亿级流量高并发下如何进行估算和调优
本课时主要讲解如何在大流量高并发场景下进行估算和调优。我们知道,垃圾回收器一般使用默认参数,就可以比较好的运行。但如果用错了某些参数,那么后果可能会比较严重,我不只一次看到有同学想要验证某个刚刚学到的优化参数,结果引起了线上 GC 的严重问题。所以你的应用程序如果目前已经满足了需求,那就不要再随便动这些参数了。另外,优化代码获得的性能提升,远远大于参数调整所获得的性能提升,你不要纯粹为了调参数而走了弯路。那么,GC 优化有没有可遵循的一些规则呢?这些“需求”又是指的什么?我们可以将目标归结为三点原创 2020-06-27 23:19:18 · 648 阅读 · 0 评论 -
二 垃圾回收:第07讲:大厂面试题:有了 G1 还需要其他垃圾回收器吗?
本课时我们主要来看下这两个高频的面试考题:G1的回收原理是什么?为什么 G1 比传统 GC 回收性能好? 为什么 G1 如此完美仍然会有 ZGC?我们在上一课时,简要的介绍了 CMS 垃圾回收器,下面我们简单回忆一下它的一个极端场景(而且是经常发生的场景)。在发生 Minor GC 时,由于 Survivor 区已经放不下了,多出的对象只能提升(promotion)到老年代。但是此时老年代因为空间碎片的缘故,会发生 concurrent mode failure 的错误。这个时候,就需要降级为.原创 2020-06-27 21:16:48 · 951 阅读 · 2 评论 -
二 垃圾回收:第06讲:深入剖析:垃圾回收你真的了解吗?(下)
由于上一课时篇幅比较多,我们在这一课时重点讲解上一课时中提到的 CMS 垃圾回收器,让你可以更好的理解垃圾回收的过程。在这里首先给你介绍几个概念:Minor GC:发生在年轻代的 GC。 Major GC:发生在老年代的 GC。 Full GC:全堆垃圾回收。比如 Metaspace 区引起年轻代和老年代的回收。理解了这三个概念,我们再往下看。CMS 的全称是 Mostly Concurrent Mark and Sweep Garbage Collector(主要并发标记清除垃圾收原创 2020-06-27 20:42:19 · 484 阅读 · 0 评论 -
二 垃圾回收:第06讲:深入剖析:垃圾回收你真的了解吗?(上)
本课时我们重点剖析 JVM 的垃圾回收机制。关于 JVM 垃圾回收机制面试中主要涉及这三个考题:JVM 中有哪些垃圾回收算法?它们各自有什么优劣? CMS 垃圾回收器是怎么工作的?有哪些阶段? 服务卡顿的元凶到底是谁?虽然 Java 不用“手动管理”内存回收,代码写起来很顺畅。但是你有没有想过,这些内存是怎么被回收的?其实,JVM 是有专门的线程在做这件事情。当我们的内存空间达到一定条件时,会自动触发。这个过程就叫作 GC,负责 GC 的组件,就叫作垃圾回收器。JVM 规范并没有规定垃圾回原创 2020-06-27 18:46:42 · 497 阅读 · 0 评论 -
二 垃圾回收:第05讲:大厂面试题:得心应手应对 OOM 的疑难杂症
在前面几个课时中,我们不止一次提到了堆(heap),堆是一个巨大的对象池。在这个对象池中管理着数量巨大的对象实例。而池中对象的引用层次,有的是很深的。一个被频繁调用的接口,每秒生成对象的速度,也是非常可观的。对象之间的关系,形成了一张巨大的网。虽然 Java 一直在营造一种无限内存的氛围,但对象不能只增不减,所以需要垃圾回收。那 JVM 是如何判断哪些对象应该被回收?哪些应该被保持呢?在古代,刑罚中有诛九族一说。指的是有些人犯大事时,皇上杀一人不足以平复内心的愤怒时,会对亲朋好友产生连带责任。诛原创 2020-06-27 17:24:22 · 647 阅读 · 0 评论 -
一 基础原理:第04讲:动手实践:从栈帧看字节码是如何在 JVM 中进行流转的
在上一课时我们掌握了 JVM 的内存区域划分,以及 .class 文件的加载机制。也了解到很多初始化动作是在不同的阶段发生的。但你可能仍对以下这些问题有疑问:怎么查看字节码文件? 字节码文件长什么样子? 对象初始化之后,具体的字节码又是怎么执行的?带着这些疑问,我们进入本课时的学习,本课时将带你动手实践,详细分析一个 Java 文件产生的字节码,并从栈帧层面看一下字节码的具体执行过程。工具介绍工欲善其事,必先利其器。在开始本课时的内容之前,先给你介绍两个分析字节码的小工具。java原创 2020-06-27 15:24:14 · 985 阅读 · 0 评论 -
一 基础原理:第03讲:大厂面试题:从覆盖 JDK 的类开始掌握类的加载机制
本课时我们主要从覆盖 JDK 的类开始讲解 JVM 的类加载机制。其实,JVM 的类加载机制和 Java 的类加载机制类似,但 JVM 的类加载过程稍有些复杂。前面课时我们讲到,JVM 通过加载 .class 文件,能够将其中的字节码解析成操作系统机器码。那这些文件是怎么加载进来的呢?又有哪些约定?接下来我们就详细介绍 JVM 的类加载机制,同时介绍三个实际的应用场景。我们首先看几个面试题。我们能够通过一定的手段,覆盖 HashMap 类的实现么? 有哪些地方打破了 Java 的类加载机制?原创 2020-06-27 14:03:51 · 577 阅读 · 0 评论 -
一 基础原理:第02讲:大厂面试题:你不得不掌握的 JVM 内存管理
本课时我们主要讲解 JVM 的内存划分以及栈上的执行过程。这块内容在面试中主要涉及以下这 3 个面试题:JVM 是如何进行内存区域划分的? JVM 如何高效进行内存管理? 为什么需要有元空间,它又涉及什么问题?带着这 3 个问题,我们开始今天的学习,关于内存划分的知识我希望在本课时你能够理解就可以,不需要死记硬背,因为在后面的课时我们会经常使用到本课时学习的内容,也会结合工作中的场景具体问题具体分析,这样你可以对 JVM 的内存获得更深刻的认识。首先,第一个问题:JVM的内存区域是怎么高效划分原创 2020-06-27 13:04:15 · 555 阅读 · 0 评论 -
一 基础原理:第01讲:一探究竟:为什么需要 JVM?它处在什么位置?
从本课时开始我们就正式进入 JVM 的学习,如果你是一名软件开发工程师,在日常工作中除了 Java 这个关键词外,还有一个名词也一定经常被提及,那就是 JVM。提到 JVM 我们经常会在面试中遇到这样的问题:为什么 Java 研发系统需要 JVM? 对你 JVM 的运行原理了解多少? 我们写的 Java 代码到底是如何运行起来的?想要在面试中完美地回答这三个问题,就需要首先了解 JVM 是什么?它和 Java 有什么关系?又与 JDK 有什么渊源?接下来,我就带你拨开这些问题的层层迷雾,想要...原创 2020-06-27 11:19:49 · 724 阅读 · 1 评论 -
深入浅出 Java 虚拟机——专题
课程目录开篇词开篇词:JVM,一块难啃的骨头基础原理第01讲:一探究竟:为什么需要 JVM?它处在什么位置?第02讲:大厂面试题:你不得不掌握的 JVM 内存管理第03讲:大厂面试题:从覆盖 JDK 的类开始掌握类的加载机制第04讲:动手实践:从栈帧看字节码是如何在 JVM 中进行流转的垃圾回收第05讲:大厂面试题:得心应手应对 OOM 的疑难杂症第06讲:深入剖析:垃圾回收你真的了解吗?(上)第06讲:深入剖析:垃圾回收你真的了解吗?(下)第07讲:大厂面试题:有了 G原创 2020-06-27 11:03:22 · 396 阅读 · 0 评论 -
Java自带的JVM性能监控及调优工具(jps、jinfo、jstat、jmap、javap)使用介绍
JVM介绍JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM性能监控及调优的意义JVM作为java程序运行时的环境,它的性能好坏直接影响java程序的性能,合适的环境对于java程序起着举足轻重的作用。性能监控及调优工具1. jpsj...转载 2020-04-29 15:39:57 · 834 阅读 · 0 评论 -
Java高级进阶:自定义ClassLoader
假如我们的类不在classpath下,而我们又想读取一个自定义的目录下的class,如果做呢?读取自定义目录的类示例读取c:/test/com/test.jdk/Key.class这个类。package com.test.jdk;public class Key { private String key = "111111";}自定义ClassLoaderim...转载 2020-04-22 00:13:31 · 481 阅读 · 0 评论 -
【基础总结】类加载过程
要点:1、类加载机制的原理2、程序初始化的顺序3、类加载的代理模式(双亲委托机制)一、类加载机制JVM把class文件加载到内存,并对数据进行校验、准备、解析、初始化,最终形成JVM可以直接使用的Java类型的过程。‘类加载全过程1、加载将class字节码文件加载到内存中,并将这些数据转换成方法区中的运行时数据(静态变量、静态代码块、常量池等),在堆中生成一个Clas...转载 2020-01-13 13:45:07 · 782 阅读 · 0 评论 -
类的编译、加载、执行过程
菜鸟版我们写了一个Book.java的类编译:执行javac test.java命令,就可以成功把Book.java转化成Book.class编译有3步:① 词法分析和输入到符号表② 注解处理③ 语义分析和生成字节码细化一点:源代码文件*.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 ->...转载 2020-01-13 13:39:23 · 788 阅读 · 0 评论 -
为什么说栈的速度快,堆的速度慢?栈和堆的区别是什么?
栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是...原创 2020-01-06 16:55:59 · 3211 阅读 · 1 评论 -
为什么栈的速度比堆要快
在栈上分配的内存系统会自动地为其释放,例如在函数结束时,局部变量将不复存在,就是系统自动清除栈内存的结果。但堆中分配的内存则不然:一切由你负责,即使你退出了new表达式的所处的函数或者作用域,那块内存还处于被使用状态而不能再利用。好处就是如果你想在不同模块中共享内存,那么这一点正合你意,坏处是如果你不打算再利用这块内存又忘了把它释放掉,那么它就会霸占你宝贵的内存资源直到你的程序退出为...转载 2020-01-03 18:09:52 · 4430 阅读 · 1 评论 -
Java 垃圾回收机制与几种垃圾回收算法
一、如何确定某个对象是“垃圾”?这一小节先了解一个最基本的问题:如果确定某个对象是“垃圾”?既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用,那么垃圾收集器如何确定某个对象是“垃圾”?通过什么方法判断一个对象可以被回收了。在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收。不失...转载 2019-12-25 00:39:26 · 608 阅读 · 0 评论 -
dos常用命令
帮助查看命令$ help有关某个命令的详细信息,请键入 HELP 命令名ASSOC 显示或修改文件扩展名关联。ATTRIB 显示或更改文件属性。BREAK 设置或清除扩展式 CTRL+C 检查。BCDEDIT 设置启动数据库中的属性以控制启动加载。查看命令帮助$ del /?删除一个或数个文件。...转载 2019-11-06 10:16:39 · 293 阅读 · 0 评论 -
Linux 在线模拟器
最近在学习Linux的一些命令的使用,但是很久之前装的Linux虚拟机被删掉了,又不想为了练习几个命令折腾一遍虚拟机。所以,就尝试地搜了一下,看看有没有在线的Linux模拟器可以使用,只要可以练习一下命令的使用即可。在google中用英文关键词一搜,还真有大牛弄出了一些在线的Linux模拟器,而且用起来还不错。搜集了4个,赶紧分享出来,供大家初步学习和实践Linux之用。jslinux::ht...转载 2019-11-06 10:14:43 · 14440 阅读 · 0 评论 -
java是编译型还是解释型语言
Java这个语言很非凡!一、你可以说它是编译型的:因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有。二、你可以说它是解释型的:因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释的了。三、但是,现在的JVM为了效率,都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的。...转载 2019-10-14 20:42:45 · 430 阅读 · 0 评论 -
什么是编译型语言和解释型语言
什么是编译型语言和解释型语言计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种:...转载 2019-10-14 20:40:48 · 541 阅读 · 0 评论 -
Java虚拟机基础知识
Java虚拟机基础知识写在前面之前老大让做一些外包面试,我的问题很简单:介绍一下工作中解决过比较有意思的问题。HashMap使用中需要注意的点。第一个问题主要是想了解一下对方项目经验的含金量,第二个问题则是测试下是否知道一些细节,比如HashMap是线程不安全的、用HashMap来做缓存的话可能导致内存泄露等,自我感觉问题设计的还可以:D~ 但是看了其他同事转载 2017-04-11 18:34:39 · 519 阅读 · 0 评论 -
深入解析java虚拟机
java虚拟机是什么“java虚拟机”可能指以下三种东西:1)、抽象规范;2)、一个具体的实现;3)、一个运行中的虚拟机实例;java虚拟机生命周期启动当启动一个java程序时,一个虚拟机实例诞生。虚拟机实例通过调用某个初始类的public static void main(String[] args)方法来运行一个java程序。任何拥有这样一个main方法转载 2017-04-11 18:36:04 · 482 阅读 · 0 评论 -
Java虚拟机JVM性能优化(一):JVM知识总结
这篇文章主要介绍了Java虚拟机JVM性能优化(一):JVM知识总结,本文是系列文章的第一篇,后续篇章请继续关注脚本之家,需要的朋友可以参考下Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨平台引擎,垃圾回收基础知识,经典的GC算法和编译优化。之后的文章会讲JVM性能优化,包转载 2017-04-11 18:38:40 · 580 阅读 · 0 评论 -
Java虚拟机JVM性能优化(二):编译器
这篇文章主要介绍了Java虚拟机JVM性能优化(二):编译器,本文先是讲解了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比,然后给出了几种常见的JVM优化方法,需要的朋友可以参考下本文将是JVM 性能优化系列的第二篇文章(第一篇:传送门),Java 编译器将是本文讨论的核心内容。本文中,作者(Eva Andreasson)首先介绍了不同种类的编译器,并对转载 2017-04-11 18:41:11 · 401 阅读 · 0 评论 -
Java虚拟机JVM性能优化(二):编译器
这篇文章主要介绍了Java虚拟机JVM性能优化(二):编译器,本文先是讲解了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比,然后给出了几种常见的JVM优化方法,需要的朋友可以参考下本文将是JVM 性能优化系列的第二篇文章(第一篇:传送门),Java 编译器将是本文讨论的核心内容。本文中,作者(Eva Andreasson)首先介绍了不同种类的编译器,并对转载 2017-04-11 18:45:01 · 577 阅读 · 0 评论 -
JVM系列-垃圾收集器与内存分配策略(二)
摘要: 垃圾收集器与内存分配策略1,判断对象是否存活a,引用计数算法 :给对象添加一个引用计数器,每当有个地方引用他时,计数器+1,失效时-1,为0的对象就是不可能再被使用的。java没有选用引用计数算法来管理内存,其中主要原因是很难解决对象之间的互相循环引用的问题。b,根搜索算法:通过一系列的名为“GC ROOTS”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为原创 2017-05-17 17:21:39 · 499 阅读 · 0 评论 -
Java虚拟机工作原理
Java虚拟机工作原理 首先我想从宏观上介绍一下Java虚拟机的工作原理。从最初的我们编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件,然后JRE加载Java字节码文件,载入系统分配给JVM的内存区,然后执行引擎解释或编译类文件,再由即时编译器将字节码转化为转载 2017-04-11 18:20:29 · 454 阅读 · 0 评论 -
java虚拟机
java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。定义 Ja原创 2017-04-11 18:16:17 · 541 阅读 · 0 评论 -
Java反射在JVM的实现
1. 什么是Java反射,有什么用?反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段。这使反射成为构建灵活应用的主要工具。反射可以:调用一些私有方法,实现黑科技。比如双卡短信发送、设置状态栏颜色、自动挂电话等。实现序列化与反序列化,比如PO的ORM,Json解析等。转载 2017-04-11 09:36:49 · 594 阅读 · 0 评论 -
JVM 深入学习:Java 解析 Class 文件过程解析
前言:身为一个java程序员,怎么能不了解JVM呢,倘若想学习JVM,那就又必须要了解Class文件,Class之于虚拟机,就如鱼之于水,虚拟机因为Class而有了生命。《深入理解java虚拟机》中花了一整个章节来讲解Class文件,可是看完后,一直都还是迷迷糊糊,似懂非懂。正好前段时间看见一本书很不错:《自己动手写Java虚拟机》,作者利用go语言实现了一个简单的JVM,虽然没有完整实现转载 2017-04-10 17:19:10 · 391 阅读 · 0 评论 -
Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序
文章转载地址:https://blog.youkuaiyun.com/qq_27093465/article/details/70292221class B extends A ,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法。子类也是这样,然后继承之后,关于程序打印输出的结果。涉及到Java类的各种成员的初始化顺序。经测试,得到如下结论:1.父类...转载 2018-12-12 21:27:39 · 497 阅读 · 0 评论 -
jvm调优二、Java内存模型及性能优化及Java垃圾回收
一、JVM内存模型 1. 首先介绍下Java程序具体执行的过程: ● Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀); ● 由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行; ● 在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runt...转载 2019-02-16 20:08:16 · 318 阅读 · 0 评论 -
Java类占不占内存
问题:看见很多帖子上说java的类不占内存,为什么呢,难道jvm加载class文件不需要内存么?求解释...回答:类不占内存怎么可能呢,类本身也是对象(Class类的对象),装到JVM里当然要占内存,而且占的还是长久型(PermGen)的内存,除了非常特殊的情况,一般不被垃圾回收的。追问:嗯,谢谢,那class类又是谁的对象呢?毕竟要创建class对象,需要先加载class类...回答...原创 2019-09-23 17:24:55 · 1237 阅读 · 0 评论