当前位置: > 投稿>正文

答谢会感恩词,答谢会感谢语(带你认识JDK8中超nice的Native)

01-20 互联网 未知 投稿

关于【答谢会感恩词】,答谢会感谢语,今天涌涌小编给您分享一下,如果对您有所帮助别忘了关注本站哦。

1、带你认识JDK8中超nice的Native Memory Tracking

本文分享自华为云社区《 Native Memory Tracking 详解(1):基础介绍》,作者:毕昇小助手。

0.引言

我们经常会好奇,我启动了一个 JVM,他到底会占据多大的内存?他的内存都消耗在哪里?为什么 JVM 使用的内存比我设置的 -Xmx 大这么多?我的内存设置参数是否合理?为什么我的 JVM 内存一直缓慢增长?为什么我的 JVM 会被 OOMKiller 等等,这都涉及到 JAVA 虚拟机对内存的一个使用情况,不如让我们来一探其中究竟。

1.简介

除去大家都熟悉的可以使用 -Xms、-Xmx 等参数设置的堆(Java Heap),JVM 还有所谓的非堆内存(Non-Heap Memory)。

可以通过一张图来简单看一下 Java 进程所使用的内存情况(简略情况):

答谢会感恩词,答谢会感谢语(带你认识JDK8中超nice的Native)

非堆内存包括方法区和Java虚拟机内部做处理或优化所需的内存。

  • 方法区:在所有线程之间共享,存储每个类的结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码。方法区在逻辑上(虚拟机规范)是堆的一部分,但规范并不限定实现方法区的内存位置和编译代码的管理策略,所以不同的 Java 虚拟机可能有不同的实现方式,此处我们仅讨论 HotSpot。
  • 除了方法区域外,Java 虚拟机实现可能需要内存用于内部的处理或优化。例如,JIT编译器需要内存来存储从Java虚拟机代码转换的本机代码(储存在CodeCache中),以获得高性能。

从 OpenJDK8 起有了一个很 nice 的虚拟机内部功能: Native Memory Tracking (NMT) 。我们可以使用 NMT 来追踪了解 JVM 的内存使用详情(即上图中的 JVM Memory 部分),帮助我们排查内存增长与内存泄漏相关的问题。

2.如何使用

2.1 开启 NMT

默认情况下,NMT是处于关闭状态的,我们可以通过设置 JVM 启动参数来开启:-XX:NativeMemoryTracking=[off | summary | detail]

注意:启用NMT会导致5% -10%的性能开销。

NMT 使用选项如下表所示:

NMT 选项

说明

off

不跟踪 JVM 本地内存使用情况。如果不指定 -XX:NativeMemoryTracking选项则默认为off。

summary

仅跟踪 JVM 子系统(如:Java heap、class、code、thread等)的内存使用情况。

detail

除了通过 JVM 子系统跟踪内存使用情况外,还可以通过单独的 CallSite、单独的虚拟内存区域及其提交区域来跟踪内存使用情况。

答谢会感恩词,答谢会感谢语(带你认识JDK8中超nice的Native)

我们注意到,如果想使用 NMT 观察 JVM 的内存使用情况,我们必须重启 JVM 来设置 XX:NativeMemoryTracking的相关选项,但是重启会使得我们丢失想要查看的现场,只能等到问题复现时才能继续观察。

笔者试图通过一种不用重启 JVM 的方式来开启 NMT ,但是很遗憾目前没有这样的功能。

JVM 启动后只有被标记为 manageable 的参数才可以动态修改或者说赋值,我们可以通过 JDK management interface (com.sun.management.HotSpotDiagnosticMXBean API) 或者 jinfo -flag 命令来进行动态修改的操作,让我们看下所有可以被修改的参数值(JDK8):

java -XX:+PrintFlagsFinal | grep manageableintx CMSAbortablePrecleanWaitMillis = 100 {manageable}intx CMSTriggerInterval = -1 {manageable}intx CMSWaitDuration = 2000 {manageable}bool HeapDumpAfterFullGC = false {manageable}bool HeapDumpBeforeFullGC = false {manageable}bool HeapDumpOnOutOfMemoryError = false {manageable}ccstr HeapDumpPath = {manageable}uintx MaxHeapFreeRatio = 100 {manageable}uintx MinHeapFreeRatio = 0 {manageable}bool PrintClassHistogram = false {manageable}bool PrintClassHistogramAfterFullGC = false {manageable}bool PrintClassHistogramBeforeFullGC = false {manageable}bool PrintConcurrentLocks = false {manageable}bool PrintGC = false {manageable}bool PrintGCDateStamps = false {manageable}bool PrintGCDetails = false {manageable}bool PrintGCID = false {manageable}bool PrintGCTimeStamps = false {manageable}

很显然,其中不包含 NativeMemoryTracking 。

2.2 使用 jcmd 访问 NMT 数据

我们可以通过jcmd 命令来很方便的查看 NMT 相关的数据:

jcmd VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]

jcmd 操作 NMT 选项如下表所示:

jcmd NMT 选项

说明

summary

打印按类别汇总的摘要信息

detail

1.打印按类别汇总的内存使用情况

2.打印虚拟内存映射

3.打印按 call site 汇总的内存使用情况

baseline

创建一个新的内存使用状况的快照,用以进行比较

summary.diff

根据上一个 baseline 基线打印新的 summary 对比报告

detail.diff

根据上一个 baseline 基线打印新的 detail 对比报告

shutdown

停止NMT

NMT 默认打印的报告是 KB 来进行呈现的,为了满足我们不同的需求,我们可以使用 scale=MB | GB 来更加直观的打印数据。创建 baseline 之后使用 diff 功能可以很直观地对比出两次 NMT 数据之间的差距。

看到 shutdown 选项,笔者本能的一激灵,既然我们可以通过 shutdown 来关闭 NMT ,那为什么不能通过逆向 shutdown 功能来动态的开启 NMT 呢?笔者找到 shutdown 相关源码(以下都是基于 OpenJDK 8):

# hotspot/src/share/vm/services/nmtDCmd.cppvoid NMTDCmd::execute(DCmdSource source, TRAPS) { // Check NMT state // native memory tracking has to be on if (MemTracker::tracking_level() == NMT_off) { output()->print_cr("Native memory tracking is not enabled"); return; } else if (MemTracker::tracking_level() == NMT_minimal) { output()->print_cr("Native memory tracking has been shutdown"); return; } ...... //执行 shutdown 操作 else if (_shutdown.value()) { MemTracker::shutdown(); output()->print_cr("Native memory tracking has been turned off"); } ......}# hotspot/src/share/vm/services/memTracker.cpp// Shutdown can only be issued via JCmd, and NMT JCmd is serialized by lockvoid MemTracker::shutdown() { // We can only shutdown NMT to minimal tracking level if it is ever on. if (tracking_level () > NMT_minimal) { transition_to(NMT_minimal); }}# hotspot/src/share/vm/services/nmtCommon.hpp// Native memory tracking level //NMT的追踪等级enum NMT_TrackingLevel { NMT_unknown = 0xFF, NMT_off = 0x00, NMT_minimal = 0x01, NMT_summary = 0x02, NMT_detail = 0x03};

遗憾的是通过源码我们发现,shutdown 操作只是将 NMT 的追踪等级 tracking_level 变成了 NMT_minimal 状态(而并不是直接变成了 off 状态),注意注释:We can only shutdown NMT to minimal tracking level if it is ever on(即我们只能将NMT关闭到最低跟踪级别,如果它曾经打开)。

这就导致了如果我们没有开启过 NMT ,那就没办法通过魔改 shutdown 操作逆向打开 NMT ,因为 NMT 追踪的部分内存只在 JVM 启动初始化的阶段进行记录(如在初始化堆内存分配的过程中通过 NMT_TrackingLevel level = MemTracker::tracking_level(); 来获取 NMT 的追踪等级,视等级来记录内存使用情况),JVM 启动之后再开启 NMT 这部分内存的使用情况就无法记录,所以目前来看,还是只能在重启 JVM 后开启 NMT。

至于提供 shutdown 功能的原因,应该就是让用户在开启 NMT 功能之后如果想要关闭,不用再次重启 JVM 进程。shutdown 会清理虚拟内存用来追踪的数据结构,并停止一些追踪的操作(如记录 malloc 内存的分配)来降低开启 NMT 带来的性能耗损,并且通过源码可以发现 tracking_level 变成 NMT_minimal 状态后也不会再执行 jcmd VM.native_memory命令相关的操作。

2.3 虚拟机退出时获取 NMT 数据

除了在虚拟机运行时获取 NMT 数据,我们还可以通过两个参数:-XX:+UnlockDiagnosticVMOptions-XX:+PrintNMTStatistics ,来获取虚拟机退出时内存使用情况的数据(输出数据的详细程度取决于你设定的跟踪级别,如 summary/detail 等)。

-XX:+UnlockDiagnosticVMOptions:解锁用于诊断 JVM 的选项,默认关闭。

-XX:+PrintNMTStatistics:当启用 NMT 时,在虚拟机退出时打印内存使用情况,默认关闭,需要开启前置参数 -XX:+UnlockDiagnosticVMOptions 才能正常使用。

3.NMT 内存 & OS 内存概念差异性

我们可以做一个简单的测试,使用如下参数启动 JVM :

-Xmx1G -Xms1G -XX:+UseG1GC -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=256m -XX:ReservedCodeCacheSize=256M -XX:NativeMemoryTracking=detail

然后使用 NMT 查看内存使用情况(因各环境资源参数不一样,部分未明确设置数据可能由虚拟机根据资源自行计算得出,以下数据仅供参考):

jcmd VM.native_memory detail

NMT 会输出如下日志:

Native Memory Tracking:Total: reserved=2813709KB, committed=1497485KB- Java Heap (reserved=1048576KB, committed=1048576KB) (mmap: reserved=1048576KB, committed=1048576KB) - Class (reserved=1056899KB, committed=4995KB) (classes #442) (malloc=131KB #259) (mmap: reserved=1056768KB, committed=4864KB) - Thread (reserved=258568KB, committed=258568KB) (thread #127) (stack: reserved=258048KB, committed=258048KB) (malloc=390KB #711) (arena=130KB #234) - Code (reserved=266273KB, committed=4001KB) (malloc=33KB #309) (mmap: reserved=266240KB, committed=3968KB) - GC (reserved=164403KB, committed=164403KB) (malloc=92723KB #6540) (mmap: reserved=71680KB, committed=71680KB) - Compiler (reserved=152KB, committed=152KB) (malloc=4KB #36) (arena=148KB #21) - Internal (reserved=14859KB, committed=14859KB) (malloc=14827KB #3632) (mmap: reserved=32KB, committed=32KB) - Symbol (reserved=1423KB, committed=1423KB) (malloc=936KB #111) (arena=488KB #1) - Native Memory Tracking (reserved=330KB, committed=330KB) (malloc=118KB #1641) (tracking overhead=211KB) - Arena Chunk (reserved=178KB, committed=178KB) (malloc=178KB) - Unknown (reserved=2048KB, committed=0KB) (mmap: reserved=2048KB, committed=0KB) ......

大家可能会发现 NMT 所追踪的内存(即 JVM 中的 Reserved、Committed)与操作系统 OS (此处指Linux)的内存概念存在一定的差异性。

首先按我们理解的操作系统的概念:

操作系统对内存的分配管理典型地分为两个阶段:保留(reserve)和提交(commit)。保留阶段告知系统从某一地址开始到后面的dwSize大小的连续虚拟内存需要供程序使用,进程其他分配内存的操作不得使用这段内存;提交阶段将虚拟地址映射到对应的真实物理内存中,这样这块内存就可以正常使用 [1]。

如果使用 top 或者 smem 等命令查看刚才启动的 JVM 进程会发现:

top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 36257 dou+ 20 0 10.8g 54200 17668 S 99.7 0.0 13:04.15 java

此时疑问就产生了,为什么 NMT 中的 committed ,即日志详情中 Total: reserved=2813709KB, committed=1497485KB 中的 1497485KB 与 top 中 RES 的大小54200KB 存在如此大的差异?

使用 man 查看 top 中 RES 的概念(不同版本 Linux 可能不同):

RES -- Resident Memory Size (KiB) A subset of the virtual address space (VIRT) representing the non-swapped physical memory a task is currently using. It is also the sum of the RSan, RSfd and RSsh fields. It can include private anonymous pages, private pages mapped to files (including program images and shared libraries) plus shared anonymous pages. All such memory is backed by the swap file represented separately under SWAP. Lastly, this field may also include shared file-backed pages which, when modified, act as a dedicated swap file and thus will never impact SWAP.

RES 表示任务当前使用的非交换物理内存(此时未发生swap),那按对操作系统 commit 提交内存的理解,这两者貌似应该对上,为何现在差距那么大呢?

笔者一开始猜测是 JVM 的 uncommit 机制(如 JEP 346[2],支持 G1 在空闲时自动将 Java 堆内存返回给操作系统,BiSheng JDK 对此做了增强与改进[3])造成的,JVM 在 uncommit 将内存返还给 OS 之后,NMT 没有除去返还的内存导致统计错误。

但是在翻阅了源码之后发现,G1 在 shrink 缩容的时候,通常调用链路如下:

G1CollectedHeap::shrink->

G1CollectedHeap::shrink_helper->

HeapRegionManager::shrink_by->

HeapRegionManager::uncommit_regions->

G1PageBasedVirtualSpace::uncommit->

G1PageBasedVirtualSpace::uncommit_internal->

os::uncommit_memory

忽略细节,uncommit 会在最后调用 os::uncommit_memory ,查看 os::uncommit_memory 源码:

bool os::uncommit_memory(char* addr, size_t bytes) { bool res; if (MemTracker::tracking_level() > NMT_minimal) { Tracker tkr = MemTracker::get_virtual_memory_uncommit_tracker(); res = pd_uncommit_memory(addr, bytes); if (res) { tkr.record((address)addr, bytes); } } else { res = pd_uncommit_memory(addr, bytes); } return res;}

可以发现在返还 OS 内存之后,MemTracker 是进行了统计的,所以此处的误差不是由 uncommit 机制造成的。

既然如此,那又是由什么原因造成的呢?笔者在追踪 JVM 的内存分配逻辑时发现了一些端倪,此处以Code Cache(存放 JVM 生成的 native code、JIT编译、JNI 等都会编译代码到 native code,其中 JIT 生成的 native code 占用了 Code Cache 的绝大部分空间)的初始化分配为例,其大致调用链路为下:

InitializeJVM->

Thread::vreate_vm->

init_globals->

codeCache_init->

CodeCache::initialize->

CodeHeap::reserve->

VirtualSpace::initialize->

VirtualSpace::initialize_with_granularity->

VirtualSpace::expand_by->

os::commit_memory

查看 os::commit_memory 相关源码:

bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, bool executable) { bool res = os::pd_commit_memory(addr, size, alignment_hint, executable); if (res) { MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC); } return res;}

我们发现 MemTracker 在此记录了 commit 的内存供 NMT 用以统计计算,继续查看 os::pd_commit_memory 源码,可以发现其调用了 os::Linux::commit_memory_impl 函数。

查看 os::Linux::commit_memory_impl 源码:

int os::Linux::commit_memory_impl(char* addr, size_t size, bool exec) { int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); if (res != (uintptr_t) MAP_FAILED) { if (UseNUMAInterleaving) { numa_make_global(addr, size); } return 0; } int err = errno; // save errno from mmap() call above if (!recoverable_mmap_error(err)) { warn_fail_commit_memory(addr, size, exec, err); vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "committing reserved memory."); } return err;}

问题的原因就在uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);这段代码上。

我们发现,此时申请内存执行的是 mmap 函数,并且传递的 port 参数是 PROT_READ|PROT_WRITE|PROT_EXEC 或 PROT_READ|PROT_WRITE ,使用 man 查看 mmap ,其中相关描述为:

The prot argument describes the desired memory protection of the mapping (and must not conflict with the open mode of the file). It is either PROT_NONE or the bitwise OR of one or more of the following flags: PROT_EXEC Pages may be executed. PROT_READ Pages may be read. PROT_WRITE Pages may be written. PROT_NONE Pages may not be accessed.

由此我们可以看出,JVM 中所谓的 commit 内存,只是将内存 mmaped 映射为可读可写可执行的状态!而在 Linux 中,在分配内存时又是 lazy allocation 的机制,只有在进程真正访问时才分配真实的物理内存。所以 NMT 中所统计的 committed 并不是对应的真实的物理内存,自然与 RES 等统计方式无法对应起来。

所以 JVM 为我们提供了一个参数 -XX:+AlwaysPreTouch,使我们可以在启动之初就按照内存页粒度都访问一遍 Heap,强制为其分配物理内存以减少运行时再分配内存造成的延迟(但是相应的会影响 JVM 进程初始化启动的时间),查看相关代码:

void os::pretouch_memory(char* start, char* end) { for (volatile char *p = start; p < end; p += os::vm_page_size()) { *p = 0; }}

让我们来验证下,开启-XX:+AlwaysPreTouch前后的效果。

NMT 的 heap 地址范围:

Virtual memory map:[0x00000000c0000000 - 0x0000000100000000] reserved 1048576KB for Java Heap from [0x0000ffff93ea36d8] ReservedHeapSpace::ReservedHeapSpace(unsigned long, unsigned long, bool, char*)+0xb8 [0x0000ffff93e67f68] Universe::reserve_heap(unsigned long, unsigned long)+0x2d0 [0x0000ffff93898f28] G1CollectedHeap::initialize()+0x188 [0x0000ffff93e68594] Universe::initialize_heap()+0x15c [0x00000000c0000000 - 0x0000000100000000] committed 1048576KB from [0x0000ffff938bbe8c] G1PageBasedVirtualSpace::commit_internal(unsigned long, unsigned long)+0x14c [0x0000ffff938bc08c] G1PageBasedVirtualSpace::commit(unsigned long, unsigned long)+0x11c [0x0000ffff938bf774] G1RegionsLargerThanCommitSizeMapper::commit_regions(unsigned int, unsigned long)+0x5c [0x0000ffff93943f54] HeapRegionManager::commit_regions(unsigned int, unsigned long)+0x7c

对应该地址的/proc/{pid}/smaps:

//开启前 //开启后c0000000-100080000 rw-p 00000000 00:00 0 c0000000-100080000 rw-p 00000000 00:00 0Size: 1049088 kB Size: 1049088 kBKernelPageSize: 4 kB KernelPageSize: 4 kBMMUPageSize: 4 kB MMUPageSize: 4 kBRss: 792 kB Rss: 1049088 kBPss: 792 kB Pss: 1049088 kBShared_Clean: 0 kB Shared_Clean: 0 kBShared_Dirty: 0 kB Shared_Dirty: 0 kBPrivate_Clean: 0 kB Private_Clean: 0 kBPrivate_Dirty: 792 kB Private_Dirty: 1049088 kBReferenced: 792 kB Referenced: 1048520 kBAnonymous: 792 kB Anonymous: 1049088 kBLazyFree: 0 kB LazyFree: 0 kBAnonHugePages: 0 kB AnonHugePages: 0 kBShmemPmdMapped: 0 kB ShmemPmdMapped: 0 kBShared_Hugetlb: 0 kB Shared_Hugetlb: 0 kBPrivate_Hugetlb: 0 kB Private_Hugetlb: 0 kBSwap: 0 kB Swap: 0 kBSwapPss: 0 kB SwapPss: 0 kBLocked: 0 kB Locked: 0 kBVmFlags: rd wr mr mw me ac VmFlags: rd wr mr mw me ac

对应的/proc/{pid}/status:

//开启前 //开启后 ... ... VmHWM: 54136 kB VmHWM: 1179476 kB VmRSS: 54136 kB VmRSS: 1179476 kB ... ... VmSwap: 0 kB VmSwap: 0 kB ...

开启参数后的 top:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 85376 dou+ 20 0 10.8g 1.1g 17784 S 99.7 0.4 14:56.31 java

观察对比我们可以发现,开启 AlwaysPreTouch 参数后,NMT 统计的 commited 已经与 top 中的 RES 差不多了,之所以不完全相同是因为该参数只能 Pre-touch 分配 Java heap 的物理内存,至于其他的非 heap 的内存,还是受到 lazy allocation 机制的影响。

同理我们可以简单看下 JVM 的 reserve 机制:

# hotspot/src/share/vm/runtime/os.cppchar* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, MEMFLAGS flags) { char* result = pd_reserve_memory(bytes, addr, alignment_hint); if (result != NULL) { MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); MemTracker::record_virtual_memory_type((address)result, flags); } return result;}# hotspot/src/os/linux/vm/os_linux.cppchar* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { return anon_mmap(requested_addr, bytes, (requested_addr != NULL));}static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) { ...... addr = (char*)::mmap(requested_addr, bytes, PROT_NONE, flags, -1, 0); ......}

reserve 通过 mmap(requested_addr, bytes, PROT_NONE, flags, -1, 0); 来将内存映射为 PROT_NONE,这样其他的 mmap/malloc 等就不能调用使用,从而达到了 guard memory 或者说 guard pages 的目的。

OpenJDK 社区其实也注意到了 NMT 内存与 OS 内存差异性的问题,所以社区也提出了相应的 Enhancement 来增强功能:

2、答谢会感恩词

答谢会感恩词

篇1

尊敬的各位来宾,女士们、先生们、朋友们:

大家上午好!今天我们在这里隆重举行20xx年度客户答谢会,共同感受过去一年来的丰收喜悦,共话美好未来。首先我代表___股份有限公司,向莅临的各位来宾表示热烈的欢迎!向多年来关心___,支持我们企业发展的各位朋友表示衷心的感谢!

众所周知,行业整体进入严冬时期,___同样面临严峻考验,但我公司长存感恩之心,坚持每年拿出千万元资金来答谢回馈我们的经销商、分销商,回馈我们的忠实客户;同时为了配合销售,拉动区域品牌竞争力,进一步开拓市场规模,公司每年投入近千万邀请3000余名核心高端客户到____进行参观体验。这四年以来我公司陆续投入近亿元来答谢支持我们的新老客户,就是希望能给予大家对产品及服务的`坚定信心,激发厂商互惠合作、和谐共赢的正能量。

今年,__顺应市场潮流特别推出了“简于形、精于内”的__系列新品及__产品__。诸多新品的上市、铺货都得到了在座各位的鼎力支持,取得了双赢的好成绩,在此感谢大家的支持,谢谢你们。

今天我们欢聚一堂,盘点全年的成果,共同庆祝我们的合作再次迈向一个更高的起点。面对成绩,我们从心底里只流淌出一句深切的感谢,在美好的明天,我们会更加握紧老朋友的手,因为今后的路有你们的陪伴才能走的更好。今天让我们举杯畅饮,感恩的心埋藏于香醇的美酒中,感谢你们从未改变的诚挚与关怀。相信在座的各位都和我有着一样的心情,就是希望通过双方的良好合作,同心同德,共商__发展大计,共谋__合作愿景,开拓创新共同实现__腾飞的梦想,将双方的事业推向一个崭新的高度。

我坚信,只要我们齐心协力,并肩携手,我们一定会推动__品牌的茁壮成长,推动我们的事业不断走向新的辉煌。“__”不仅是我们企业的品牌,也是我们共同创造美好明天的平台。__成长的每一步都离不开各位朋友的关心和支持。在这里,我代表___股份有限公司再次向各位来宾,向多年来关心和支持___发展的各位朋友表示衷心的感谢!祝愿各位朋友及家人身体健康,万事如意!

谢谢大家!

篇2

晚上好!

欢迎各位领导、各位嘉宾在年终岁末百忙之中光临我们__化纤薄宴,本人向出席今天活动的领导嘉宾深表真诚的谢意!

朋友们,金龙摆尾庆硕果,银蛇待舞祈心愿。回眸依稀留下深深脚印的20__年,是一个值得我们庆贺的年度,我和朋友们一样激动不已。中华民族在走向民族复兴的道路上,在20__年的书页上写下了灿烂的篇章。祖国实现了上可九天揽月、下可五洋捉鳖的神九飞天与蛟龙潜水之梦;同年我们喜迎了党的十八大顺利召开。无不胜数事例告诉我们,祖国正在强大、人民正齐奔幸福小康。

我们__的发展得益于祖国强盛。同样在过去的20__年,__化纤自投产以来,20__年也是值得载入__发展史与圈点的一年。正由于各级领导的关心、承蒙各位朋友的支持与信任,给了我们__至今乃至以后的发展动力。各位客户的真诚与信任,永远是我们增强发展信心的源泉;各位客户的关注与厚爱,始终是我们前行的动力,客户就是我们的生存基础。在这里我再次向你们表示感谢。

我们__化纤在包括海内外客户的支持下,20__年顺利完成了预期的销售目标,特别是外贸总额比上年度翻两番以上,与此同时公司的其他各项事业取得显著的成就。占地100亩的__科技新厂区已与去年开始建设。公司抓住以科技进步、企业转型升级为基础;实施了以高速纺FDY产品为主导,UDY、POY、DTY等多品种发展。企业成立了科技研发中心,20__年12月,公司获得了国家级高新技术企业称号。企业经营业绩不断提升、管理方法不断创新。在各级部门的关心支持与各位客户共同努力下,科技、质量、安全、财务工作等管理上分别通过有关部门的评审,成为德清乃至湖州地区管理示范企业。公司在不断壮大的同时,也不忘回馈社会。虽然我们处于创业阶段,每一步都走的比较困难,但是,我们有着深深的社会情结,积极参与社会公益事业。

公司坚持以“汇你我智慧,成事业兴隆”的文化立企理念,党群工团工作扎实开展,去年公司分别被市县上级命名为“德清县文明单位”、“德清县先进基层党组织”、“湖州市劳动关系和谐企业”、“湖州市诚信民营企业”等荣誉称号。

尊敬的各位领导、各位客户,以上成绩的取得有非常重要一条,源于各位朋友支持的结果,以及建立诚信与稳定的市场。各位客户朋友,当您与__签下第一份订单时,我们就成为了共存体,所以:

我们的责任,就是不断提升自我,努力超越客户的期望。

我们的追求,就是以诚信为本,广交各界朋友,共享双方努力成果,诠释你我人生价值。

所以我们__化纤将在以后的`日子里,将以责任与追求秉承自己的企业文化,为在座的各位客户提供优质满意的产品。在公司发展上,20__年我们将实施了新厂区前期建设,现厂区将实施新技术的涤纶母丝生产线等技改项目,在其它各项工作上将以优化管理出成效。“丝出__、朋满天下”,__将是你的满意选择。

朋友们,成绩只能铭记,梦想需要努力。让我们携手并肩,再接再励,为共同发展谱写新篇章。

最后祝大家在新的一年里生意兴隆、万事如意、身体健康、合家安康、谢谢大家!

答谢会感恩词

篇1

尊敬的各位来宾,女士们、先生们、朋友们:

大家上午好!今天我们在这里隆重举行20xx年度客户答谢会,共同感受过去一年来的丰收喜悦,共话美好未来。首先我代表___股份有限公司,向莅临的各位来宾表示热烈的欢迎!向多年来关心___,支持我们企业发展的各位朋友表示衷心的感谢!

众所周知,行业整体进入严冬时期,___同样面临严峻考验,但我公司长存感恩之心,坚持每年拿出千万元资金来答谢回馈我们的经销商、分销商,回馈我们的忠实客户;同时为了配合销售,拉动区域品牌竞争力,进一步开拓市场规模,公司每年投入近千万邀请3000余名核心高端客户到____进行参观体验。这四年以来我公司陆续投入近亿元来答谢支持我们的新老客户,就是希望能给予大家对产品及服务的`坚定信心,激发厂商互惠合作、和谐共赢的正能量。

今年,__顺应市场潮流特别推出了“简于形、精于内”的__系列新品及__产品__。诸多新品的上市、铺货都得到了在座各位的鼎力支持,取得了双赢的好成绩,在此感谢大家的支持,谢谢你们。

今天我们欢聚一堂,盘点全年的成果,共同庆祝我们的合作再次迈向一个更高的起点。面对成绩,我们从心底里只流淌出一句深切的感谢,在美好的明天,我们会更加握紧老朋友的手,因为今后的路有你们的陪伴才能走的更好。今天让我们举杯畅饮,感恩的心埋藏于香醇的美酒中,感谢你们从未改变的诚挚与关怀。相信在座的各位都和我有着一样的心情,就是希望通过双方的良好合作,同心同德,共商__发展大计,共谋__合作愿景,开拓创新共同实现__腾飞的梦想,将双方的事业推向一个崭新的高度。

我坚信,只要我们齐心协力,并肩携手,我们一定会推动__品牌的茁壮成长,推动我们的事业不断走向新的辉煌。“__”不仅是我们企业的品牌,也是我们共同创造美好明天的平台。__成长的每一步都离不开各位朋友的关心和支持。在这里,我代表___股份有限公司再次向各位来宾,向多年来关心和支持___发展的各位朋友表示衷心的感谢!祝愿各位朋友及家人身体健康,万事如意!

谢谢大家!

篇2

晚上好!

欢迎各位领导、各位嘉宾在年终岁末百忙之中光临我们__化纤薄宴,本人向出席今天活动的领导嘉宾深表真诚的谢意!

朋友们,金龙摆尾庆硕果,银蛇待舞祈心愿。回眸依稀留下深深脚印的20__年,是一个值得我们庆贺的年度,我和朋友们一样激动不已。中华民族在走向民族复兴的道路上,在20__年的书页上写下了灿烂的篇章。祖国实现了上可九天揽月、下可五洋捉鳖的神九飞天与蛟龙潜水之梦;同年我们喜迎了党的十八大顺利召开。无不胜数事例告诉我们,祖国正在强大、人民正齐奔幸福小康。

我们__的发展得益于祖国强盛。同样在过去的20__年,__化纤自投产以来,20__年也是值得载入__发展史与圈点的一年。正由于各级领导的关心、承蒙各位朋友的支持与信任,给了我们__至今乃至以后的发展动力。各位客户的真诚与信任,永远是我们增强发展信心的源泉;各位客户的关注与厚爱,始终是我们前行的动力,客户就是我们的生存基础。在这里我再次向你们表示感谢。

我们__化纤在包括海内外客户的支持下,20__年顺利完成了预期的销售目标,特别是外贸总额比上年度翻两番以上,与此同时公司的其他各项事业取得显著的成就。占地100亩的__科技新厂区已与去年开始建设。公司抓住以科技进步、企业转型升级为基础;实施了以高速纺FDY产品为主导,UDY、POY、DTY等多品种发展。企业成立了科技研发中心,20__年12月,公司获得了国家级高新技术企业称号。企业经营业绩不断提升、管理方法不断创新。在各级部门的关心支持与各位客户共同努力下,科技、质量、安全、财务工作等管理上分别通过有关部门的评审,成为德清乃至湖州地区管理示范企业。公司在不断壮大的同时,也不忘回馈社会。虽然我们处于创业阶段,每一步都走的比较困难,但是,我们有着深深的社会情结,积极参与社会公益事业。

公司坚持以“汇你我智慧,成事业兴隆”的文化立企理念,党群工团工作扎实开展,去年公司分别被市县上级命名为“德清县文明单位”、“德清县先进基层党组织”、“湖州市劳动关系和谐企业”、“湖州市诚信民营企业”等荣誉称号。

尊敬的各位领导、各位客户,以上成绩的取得有非常重要一条,源于各位朋友支持的结果,以及建立诚信与稳定的市场。各位客户朋友,当您与__签下第一份订单时,我们就成为了共存体,所以:

我们的责任,就是不断提升自我,努力超越客户的期望。

我们的追求,就是以诚信为本,广交各界朋友,共享双方努力成果,诠释你我人生价值。

所以我们__化纤将在以后的`日子里,将以责任与追求秉承自己的企业文化,为在座的各位客户提供优质满意的产品。在公司发展上,20__年我们将实施了新厂区前期建设,现厂区将实施新技术的涤纶母丝生产线等技改项目,在其它各项工作上将以优化管理出成效。“丝出__、朋满天下”,__将是你的满意选择。

朋友们,成绩只能铭记,梦想需要努力。让我们携手并肩,再接再励,为共同发展谱写新篇章。

最后祝大家在新的一年里生意兴隆、万事如意、身体健康、合家安康、谢谢大家!

答谢会感恩词

尊敬的各位领导、各位来宾、各位同事:

大家晚上好!今天,我们怀着无比兴奋和喜悦的心情,在海大酒店欢聚一堂,举行xx购物广场20xx年商户答谢会。在这个令人激动的时刻,我代表xx购物广场及董事长,向出席今天活动的领导、嘉宾、新老商户朋友们表示热烈的欢迎和衷心的感谢! 岁月如歌,跋涉似舞。20xx是我们挑战自我、超越自我的一年。今天的年终商户答谢会,事实上就是商超界朋友的一次感恩行动。下面我将从以下四个方面总结20xx展望20xx。

一、齐心协力、同舟共济,公司规模和业绩长足增长:

20xx年我们定下了年度总任务,每一个销售人员也都给自己定下了个人年度销售目标。面对日益变幻的市场风云,xx每个员工都迎难而上,在激烈的市场竞争中,勇立潮头,在市场的波涛中歌唱。大家紧紧围绕着战略部署,坚持“一切为了顾客和商户、一切为了公司”的.理念,以与时俱进的市场开拓、无微不至的顾客服务,赢得了广大顾客的满意和信赖。经过一年的拼搏,我们终于不负众望,公司总人数同比去年年底增长 %,年度总业绩同比去年全年增长 %。

目标的实现离不开广大合作伙伴的信赖和厚爱。

二、持续创新、迎接挑战,加速品牌提升。

20xx我们把它定义为xx购物广场“责任、沟通、学习、创新”年,我们全体员工迎接挑战。3月份基本完成合同签约; 4月份品牌升级,新品牌入驻,10月份国庆及店庆取得双佳绩.整个20xx年可以说是圆满的结束了。

山不厌高,海不厌深。xx购物广场的事业发展是无限的。20xx我们建立竞争机制和淘汰,加大员工责任心的培养力度,让敢于承担责任的员工主动跳出来,加强每月“销售冠军”的评选工作,充分调动员工的积极性.

三、xx来感谢商界各位朋友的支持,同时也用真情回馈商户

20xx目标实现更离不开广大商户朋友的支持。公司在不断壮大的同时,也不忘回馈商户。xx购物广场虽然处于发展阶段,但是我们与商户就如同船与水的关系,我们给商户提供了更良好的发展平台,在做每一期企划活动中,加强对商户的媒体支持和广告宣传,更有我们的员工和管理人员在商户与商场,商场与顾客间提供良好的互动关系和良性循环.

四、回首过去,展望美好未来:

20xx是值得骄傲的一年,展望未来,站在新的高度,遇上全球金融海啸的恶劣环境,处在与狼共舞的竞争环境中,我们依然激情澎湃,斗志昂扬。20xx我们的奋斗目标是:将整个公司品质精益求精,营业额再增长 %,硬件设施及信息技术投入再增加 %,将现有的商场购物环境再改进升级.走信息技术平台,走多元化经营路线,最终的目标是满足全疆广大消费者的购物需求。加深与商户的战略合作.

辉煌让历史铭记,梦想她仍在前方。让我们携手并肩,再接再励,用自己的努力谱写xx购物广场的新篇章。最后祝大家在新的一年里万事如意、生意兴隆!谢谢大家!

本文关键词:答谢会感谢的话,感恩答谢会结束感谢词,顾客答谢会感恩词,感恩答谢会结束语,答谢会感谢语。这就是关于《答谢会感恩词,答谢会感谢语(带你认识JDK8中超nice的Native)》的所有内容,希望对您能有所帮助!更多的知识请继续关注《犇涌向乾》百科知识网站:http://www.029ztxx.com!

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。

猜你喜欢