- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 ColdFusion 11 中内置了一个简单的 REST API,它允许我们的供应商更新产品信息。他们发送的大部分数据(大约 30 个属性)都是简单的值——字符串和数字。一个属性是代表图像文件的 Base64 编码字符串。 REST API 更新数据库中的简单数据值,然后读取图像并将其调整为适合在网站上使用的 4 种大小。我注意到供应商偶尔会发送一些请求(20MB+)的大图像,并且这些请求通常会在 ImageReadBase64()
所在的行上导致“java.lang.OutOfMemoryError: Java heap space”。函数被调用。我们在这台服务器上运行了其他网络应用程序,似乎在处理这些图像时被锁定的内存也会导致这些应用程序出现问题。我试图弄清楚代码中是否有任何我可以做的事情来减少这些问题,即使它正在想办法在图像“太大”(超过一定大小)时不处理它们。这是运行以处理图像的所有代码:
public struct function getDimensionsToEnlarge(
required numeric imageWidth,
required numeric imageHeight,
required numeric minWidth,
required numeric minHeight
) {
LOCAL.Dimensions={
width=-1,
height=-1
};
if ( ARGUMENTS.minHeight > 0
&& ARGUMENTS.minWidth > 0
&& ARGUMENTS.imageHeight < ARGUMENTS.minHeight
&& ARGUMENTS.imageWidth < ARGUMENTS.minWidth
) {
LOCAL.Dimensions.width=ARGUMENTS.minWidth;
LOCAL.Dimensions.height=ARGUMENTS.minHeight;
}
return LOCAL.Dimensions;
}
public struct function getDimensionsToShrink(
required numeric imageWidth,
required numeric imageHeight,
required numeric maxWidth,
required numeric maxHeight
) {
LOCAL.Dimensions={
width=-1,
height=-1
};
if ( ARGUMENTS.maxHeight > 0
&& ARGUMENTS.maxWidth > 0
&& ( ARGUMENTS.imageHeight > ARGUMENTS.maxHeight
|| ARGUMENTS.imageWidth > ARGUMENTS.maxWidth
)
) {
LOCAL.Dimensions.width=ARGUMENTS.maxWidth;
LOCAL.Dimensions.height=ARGUMENTS.maxHeight;
}
return LOCAL.Dimensions;
}
public struct function getDimensionsToFit(
required numeric imageWidth,
required numeric imageHeight,
required numeric minWidth,
required numeric minHeight,
required numeric maxWidth,
required numeric maxHeight
) {
LOCAL.Dimensions={
width=-1,
height=-1
};
LOCAL.Dimensions =
getDimensionsToEnlarge(
imageHeight=ARGUMENTS.imageHeight,
imageWidth=ARGUMENTS.imageWidth,
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight
);
if (LOCAL.Dimensions.width < 0 && LOCAL.Dimensions.height < 0)
LOCAL.Dimensions =
getDimensionsToShrink(
imageHeight=ARGUMENTS.imageHeight,
imageWidth=ARGUMENTS.imageWidth,
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
return LOCAL.Dimensions;
}
public any function scale(
required any image,
string action="fit",
numeric minWidth=-1,
numeric minHeight=-1,
numeric maxWidth=-1,
numeric maxHeight=-1
) {
LOCAL.Dimensions={
width=-1,
height=-1
};
LOCAL.Image=Duplicate(ARGUMENTS.image);
switch (ARGUMENTS.action) {
case "shrink":
LOCAL.Dimensions =
getDimensionsToShrink(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
break;
case "enlarge":
LOCAL.Dimensions =
getDimensionsToEnlarge(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight
);
break;
default:
LOCAL.Dimensions =
getDimensionsToFit(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight,
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
break;
}
if (LOCAL.Dimensions.width > 0 && LOCAL.Dimensions.height > 0) {
ImageSetAntialiasing(LOCAL.Image, "on");
ImageScaleToFit(
LOCAL.Image,
LOCAL.Dimensions.width,
LOCAL.Dimensions.height
);
}
return LOCAL.Image;
}
public void function createLargeThumbnail(required any image) {
ImageWrite(
scale(image=ARGUMENTS.image, maxHeight=500, maxWidth=700),
getLargeImagePath(),
0.75,
true
);
return;
}
public void function createMediumThumbnail(required any image) {
ImageWrite(
scale(image=ARGUMENTS.image, maxHeight=300, maxWidth=300),
getMediumImagePath(),
0.75,
true
);
return;
}
public void function createSmallThumbnail(required any image) {
ImageWrite(
scale(image=ARGUMENTS.image, maxHeight=50, maxWidth=50),
getSmallImagePath(),
0.75,
true
);
return;
}
public void function createMobileThumbnail(required any image) {
ImageWrite(
scale(image=ARGUMENTS.image, maxHeight=50, maxWidth=300),
getMobileImagePath(),
0.75,
true
);
return;
}
public void function createProductThumbnails(required any image) {
createLargeThumbnail(argumentCollection=ARGUMENTS);
createMediumThumbnail(argumentCollection=ARGUMENTS);
createSmallThumbnail(argumentCollection=ARGUMENTS);
createMobileThumbnail(argumentCollection=ARGUMENTS);
return;
}
createProductThumbnails(ImageReadBase64(ARGUMENTS.ImageUpload));
我需要做些什么来启动垃圾收集?
最佳答案
您正在拨打 scale()
四次(在每个 createXXXThumbnail()
中),有效地将您的内存使用量增加了四倍,因为您明确地 duplicate()
通过参数传递的图像对象。你也调用原生ImageScaleToFit()
with the expensive default interpolation四次,这大概在内部创建了另一个字节数组。因此,看似无辜的 20 MB 在处理过程中很容易膨胀到 160 MB 甚至更多。
关于java - "java.lang.OutOfMemoryError: Java heap space"在 ColdFusion 11 中使用 ImageReadBase64() 读取大图像时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64882065/
我系统上的docker info命令输出如下: # docker info Containers: 0 Images: 0 Storage Driver: devicemapper ..... D
我如何捕获用户按下 ctrl + space + space? 我用这段代码成功测试了ctrl + space: RegisterHotKey(0, 1, MOD_CONTROL, VK_SPACE)
我有一个 Matlab 图,我想在论文中使用。此图包含多个 cdfplots。现在的问题是我不能使用标记,因为在情节中变得非常密集。如果我想让样本稀疏,我必须从 cdfplot 中删除一些样本,这将导
我正在尝试获取我将用于备份的服务器上所有数据库的列表。以下是我尝试打印数据库列表但出现错误的代码片段。如何解决?添加双方括号并不能解决问题。 我已经研究了一些类似的问题,但我无法弄清楚。 grep:字
我了解 new gen/old gen/perm gen 之间的区别,但我不知道“To Space”和“From Space”是什么。我看到我的“From Space”使用率达到 99.8%,而“To
我当前有一个返回时看起来像这样的字符串: //This is the url string // the-great-debate---toilet-paper-over-or-under-the-r
我太亲密了。我正在尝试编写用于Notepad++的正则表达式表达式,以用空格替换破折号,而忽略已经用前置/后置空格代替的破折号。我知道我可以用“foobarfoo”搜索/替换“-”,然后搜索“-”替换
我的 ANTLR 代码如下: LPARENTHESIS : ('('); RPARENTHESIS : (')'); fragment CHARACTER : ('a'..'z'|'0'..'9'|)
在过去的 6 个小时里,我一直在尝试在我的 webgl 应用程序中实现点击,但我找不到任何关于这个主题的足够清晰的内容。 到目前为止,我想出的是伪代码: screenSpace = mousePosi
如何使用正则表达式来测试空格或制表符,但不测试换行符? 我尝试了 \s,但我发现它也测试换行符。 我使用C# (.NET) 和 WPF ,但这应该不重要。 最佳答案 使用字符类:[\t] 关于rege
我想解析以下内容: name:name 名称以字母开头和结尾,并且可以包含字母和空格的任意组合。它们也可以是空白的。我的规则是: identifier = alnum (space* alnum)*;
有什么办法可以让 Eden 空间按比例大于 Tenured 空间吗?有 NewRatio 但它以相反的方式工作(Tenured 比 Eden 大几倍)。 我知道有 -XX:NewSize= 和 -XX
我正在编写一个程序,让人们输入他们的信息(姓名,年龄......)。对于姓名输入,我不希望他们留空,只允许字母和空格,但不能以空格开头。合适的正则表达式是什么?我尝试使用: ^[a-zA-Z\\s]*
好的,我正在制作一个程序,它也可以制作垂直线、水平线和对角线!我对我的一个没有任何意义的输出感到困惑。 所以我的伪代码是这样的: //enter a char //enter a number
当我使用 scp 从服务器复制文件时, 我错误地使用了命令 scp xxx@xxxx:xx.zip . 当我完成后,我发现该文件的名称是 .我无法解压 这是目录列表。 http://pfil
我需要一个 bat 文件来获取 Windows 系统中 C:\驱动器的总空间和可用空间(以 GB(千兆字节)为单位),并创建一个包含详细信息的文本文件。 注意:我不想使用任何外部实用程序。 最佳答案
作为预处理我的数据的一部分。我希望能够替换空格后跟数字,同时保留空格后跟一个字符。例如: Input String: '8.1.7 Sep 2000 Dec 2004 Dec 2006 Indefin
我正在编写一个 XPath 表达式,但我修复了一个奇怪的错误,但是以下两个 XPath 表达式之间有什么区别? "//td[starts-with(normalize-space()),'Posted
在 C 中,当读取文本文件时,是否有可能接受一个未知大小的整数值(假设它适合 int),因为它在数字之前和数字之后都有一个空格。例如。 363 865我想分别存储 363 和 865,因为它们有自己的
在 sys/ptrace.h 中,我看到类似这样的内容: @define PT_READ_I 1 /* read world in child's I space*/ @define PT_READ
我是一名优秀的程序员,十分优秀!